gpt4 book ai didi

c++ - 为什么 boost::serialization 不检查 XML 文件中的标签名称?

转载 作者:可可西里 更新时间:2023-11-01 17:55:27 26 4
gpt4 key购买 nike

我开始对 XML 存档使用 boost::serialization。我可以生成和读取数据,但是当我手动修改 XML 并交换两个标签时,它“失败失败”(即它愉快地进行)。

这是一个 self 完成的小例子,展示了我所看到的:

#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 中所示.

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

最佳答案

只是改变两行的顺序不会导致 xml_archive_parsing_error异常(exception)。 doc你链接的本身就是这样说的:

(...)This might be possible if only the data is changed and not the XML attributes and nesting structure is left unaltered.(...)

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

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

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

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

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

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

关于c++ - 为什么 boost::serialization 不检查 XML 文件中的标签名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224019/

26 4 0