gpt4 book ai didi

c++ - Cereal——多重反序列化

转载 作者:行者123 更新时间:2023-11-28 02:51:50 33 4
gpt4 key购买 nike

我对 Cereal 很陌生,我有一个(可能很简单的)问题:

当我不知道 (XML) 存档中的对象数量时,有没有办法反序列化多个对象?

我试过类似的方法:

std::ifstream is("c:\\data.xml");
cereal::XMLInputArchive archive(is);

while (is.good() && !is.eof())
{
try{
ObjectIn oIn;
archive(oIn);
objectList.push_back(oIn);
}
catch (exception e){
}
}

假设我在 XML 文件中有 3 个对象,而我收到的 XML 没有包含对象编号。所以,在我的代码中,前 3 次迭代没问题,但第 4 次生成“CerealTest.exe 中 0x0035395E 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000018。”

你有什么建议吗?

最佳答案

在尝试回答您的问题之前,让我问您一个问题:如果您要序列化未知数量的项目,为什么不将这些项目放在某个旨在容纳可变数量项目的容器中?您可以使用 std::vector 来存储您的 ObjectIn 并轻松处理任意数量的对象。您的代码看起来像这样:

std::vector<MyObjects> vec;
{
cereal::XMLInputArchive ar("filename");
ar( vec );
} // get in the habit of using cereal archives in an RAII fashion

上面的代码适用于任意数量的序列化对象,假设 cereal 生成了 XML。您甚至可以在 XML 代码中添加或删除 vector 中的元素,它会正常工作。


如果你坚持要读取一些未知数量的对象,而不是将它们放在一个旨在容纳可变数量元素的容器中,你可以这样做(但请注意,这不是一个好主意 - 你真的应该尝试改变你的序列化策略而不是这样做):

{
cereal::XMLInputArchive ar("filename");
try
{
while( true )
{
ObjectIn ob;
ar( ob );
objectList.push_back(oIn);
}
catch( ... )
{ }
}

让我再次强调,这从根本上说是序列化策略的问题,如果您不知道会有多少,则应该序列化容器而不是单点项目。上面的代码无法处理其他任何读入,它只是尝试盲目读入,直到遇到异常。如果您的对象遵循某种命名模式,您可以使用名称-值对 (cereal::make_nvp) 按名称检索它们。

关于c++ - Cereal——多重反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22863600/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com