为什么不对XML档案中的标签名称进行boost :: serialization检查?

F'x*_*F'x 8 c++ boost xml-serialization boost-serialization

我开始在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);
}
Run Code Online (Sandbox Code Playgroud)

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

<producer>XXX</producer>
<producer_version>0.0.1</producer_version>
Run Code Online (Sandbox Code Playgroud)

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

  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;
Run Code Online (Sandbox Code Playgroud)

当输入前一个输出时,它按预期工作(输出"XXX 0.0.1").但是,如果我提供XML,其中我更改了两行"producer"和"producer_version"的顺序,它仍然运行并输出"0.0.1 XXX".

因此,它无法识别标签没有预期的名称,只是继续.xml_archive_parsing_error文档中所示,我原以为它会抛出异常.

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

fog*_*ogo 6

只更改两行的顺序不会导致xml_archive_parsing_error异常.您链接的文档说明了这一点:

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

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

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

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

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

而你打印的答案仍然是"XXX 0.0.1".

由于这只将您的序列化数据格式化为XML,因此无需检查标记名称.它们仅用于使序列化输出更具可读性.

  • 有点难过,但如果是这样的话.感谢您的信息(由于过度使用否定和条件,我发现此文档段落特别难以阅读). (6认同)