谷物 - 多次反序列化
Cereal - multiple de-serialization
我对谷物很陌生,我有一个(可能很简单的)问题:
当我不知道 (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 中0x0035395E未处理的异常.exe: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 代码的向量中添加或删除元素,它将正常工作。
如果你坚持读取一些未知数量的对象,而不是将它们放在一个设计为容纳可变数量元素的容器中,你可以这样(但请注意这不是一个好主意 - 你真的应该尝试改变你的序列化策略而不是这样做):
{
cereal::XMLInputArchive ar("filename");
try
{
while( true )
{
ObjectIn ob;
ar( ob );
objectList.push_back(oIn);
}
catch( ... )
{ }
}
让我再次强调,这从根本上是您的序列化策略的问题,如果您不知道会有多少个,您应该序列化容器而不是点菜项目。 上面的代码无法处理其他任何内容的读取,它只是尝试盲目读取内容,直到遇到异常。 如果你的对象遵循某种命名模式,你可以使用名称-值-值对(cereal::make_nvp
)按名称检索它们。
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 如何在C++中从头开始反序列化文件(没有库)
- 在协议缓冲区 c++ 中反序列化字符串数组
- 在进程的内存中序列化/反序列化
- 谷物/C++ 11 - 如何指定反序列化的可选参数
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- 使用谷物序列化/反序列化 SFML 向量类
- 谷物 - 多次反序列化