谷物 - 多重反序列化

时间:2014-04-04 13:01:04

标签: c++ serialization 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。”

你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在尝试回答您的问题之前,让我问一个问题:如果您要序列化未知数量的项目,为什么不将这些项目放在某个容器中,以容纳可变数量的项目?您可以使用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::XMLInputArchive ar("filename");
  try
  {
    while( true )
    {
      ObjectIn ob;
      ar( ob );
      objectList.push_back(oIn);
    }
  catch( ... )
  { }
}

上面的工作与序列化的任意数量的对象,假设谷物生成XML开始。您甚至可以在XML代码中添加或删除矢量中的元素,它将正常工作。


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

cereal::make_nvp

再次让我强调,这对您的序列化策略来说基本上是一个问题,如果您不知道将有多少项,您应该序列化容器而不是单点菜单。上面的代码无法处理任何其他内容的读取,它只是试图盲目地读取内容,直到遇到异常。如果您的对象遵循一些命名模式,则可以使用名称 - 值对({{1}})按名称检索它们。