代码之家  ›  专栏  ›  技术社区  ›  F'x

为什么不Boost::序列化检查XML存档中的标记名?

  •  8
  • F'x  · 技术社区  · 14 年前

    我开始在XML存档中使用boost::serialization。我可以生成和读取数据,但是当我手工修改XML并交换两个标记时,它“失败了”(即,它可以顺利地进行)。

    下面是一个自我完善的小例子,展示了我所看到的:

    #include <iostream>
    #include <fstream>
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/serialization/nvp.hpp>
    #include <boost/serialization/split_member.hpp>
    using namespace std;
    
    int main (void)
    {
      boost::archive::xml_oarchive oa (cout);
      static const string producer = "XXX", version  = "0.0.1";
      oa << boost::serialization::make_nvp ("producer", producer);
      oa << boost::serialization::make_nvp ("producer_version", version);
    }
    

    这会将XML写入标准输出,其中包含:

    <producer>XXX</producer>
    <producer_version>0.0.1</producer_version>
    

    现在,我用一个阅读器替换主函数中的所有代码:

      boost::archive::xml_iarchive ia (cin);
      string producer, version;
      ia >> boost::serialization::make_nvp ("producer", producer);
      ia >> boost::serialization::make_nvp ("producer_version", version);
      cout << producer << "  " << version << endl;
    

    当输入上一个输出时,它按预期工作(输出“xxx 0.0.1”)。但是,如果我向它提供XML,在XML中我更改了两行的顺序“producer”和“producer_version”,它仍然运行并输出“0.0.1xxx”。

    因此,它无法识别标签没有预期的名称,只需继续。我本以为它会 xml_archive_parsing_error 例外情况,如中所示 the doc .

    这里有人有这方面的经验吗?我做错了什么?

    1 回复  |  直到 10 年前
        1
  •  6
  •   fogo    14 年前

    仅仅改变两行的顺序不会导致 xml_archive_parsing_error 例外。这个 doc 你已经联系说,它本身:

    (…)如果只更改数据而不更改XML属性和嵌套结构,则可能发生这种情况。(…)

    您没有更改属性,订单更改保留了结构(XML的第一级仍然有两个字段)。任何例外都不会以这种方式抛出。

    此外,在使用 make_nvp function ,name参数不会对正在读取的内容进行任何限制。它只会任意告诉新名称-值对要使用的名称。

    因此,您可以更改输入中XML标记的名称,只要不更改预期顺序,即可以重命名 producer producer_version 您的XML到 foo bar 仍然可以正确读取序列化数据,即:

    <foo>XXX</foo>
    <bar>0.0.1</bar>

    你打印的答案仍然是 “xxx 0.0.1” .

    由于这只将序列化数据格式化为XML,因此没有兴趣检查标记名。它们仅用于使序列化输出更具可读性。