我开始在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函数中的所有代码:
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
异常,如the doc所示。
这里有人有经验吗?我做错了什么?
答案 0 :(得分:6)
只更改两行的顺序不会导致xml_archive_parsing_error
异常。您链接的doc表示自己:
(...)如果只更改数据而不是XML属性和嵌套结构保持不变,这可能是可能的。(...)
您没有更改属性,订单更改保留了结构(仍然是XML的第一级上的两个字段)。这样就不会有任何例外。
此外,使用make_nvp function
读取XML时,name参数不会对正在读取的内容施加任何限制。它只会随意告诉与新名称 - 值对一起使用的名称。
因此,您可以更改输入中XML标记的名称,只要您不更改预期顺序,即可以将XML上的producer
和producer_version
重命名为{{1 }和foo
仍然会正确读取序列化数据,即:
bar
<foo>XXX</foo>
您打印的答案仍为“XXX 0.0.1”。
由于这只将序列化数据格式化为XML,因此无需检查标记名称。它们仅用于使序列化输出更具可读性。