8

我开始在 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>

现在,我将 main 函数中的所有代码替换为 reader:

  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 并更改了“producer”和“producer_version”两行的顺序,它仍然会运行并输出“0.0.1 XXX”。

因此,它无法识别标签没有预期的名称,然后继续。我本来希望它会引发xml_archive_parsing_error异常,如doc中所示。

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

4

1 回答 1

6

只是改变两行的顺序不会导致xml_archive_parsing_error异常。您链接的文档本身就是这样说的:

(...)如果仅更改数据而不更改 XML 属性和嵌套结构,这可能是可能的。(...)

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

此外,当使用 读取 XML 时make_nvp function,name 参数不会对正在读取的内容施加任何限制。它只会随意告诉要与新名称-值对一起使用的名称。

因此,您可以在输入中更改 XML 标记的名称,只要您不更改预期顺序,即您可以将XML 上的和重命名为producer并且仍然可以正确读取序列化数据,即:producer_versionfoobar

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

您的打印答案仍然是"XXX 0.0.1"

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

于 2010-02-08T19:28:52.860 回答