使用文本存档增加序列化问题

时间:2014-01-10 19:11:20

标签: c++ boost-serialization

我有一个非常简单的类,我想用boost :: serialize序列化。

class Entity {      
private:
    ObjectType objectType;
public:
    Entity(ObjectType t = tA) { objectType = t; }
public:
    ~Entity() {}
private:
      friend class boost::serialization::access;
  template <typename Archive>
  friend void boost::serialization::serialize(Archive& ar, Entity& o, const unsigned int version);
};

}

ObjectType是一个枚举:

typedef enum ObjectType {
 tA,
 tB,
 ...
 tZ
}

序列化功能如下:

template<class Archive>
void serialize(Archive & ar, Entity & o, const unsigned int version)
{
      ar & o.objectType;
}

使用以下功能执行保存和加载:

void saveObject2File(const Entity &o, const char * filename) {
 std::ofstream ofs(filename);
 boost::archive::text_oarchive oa(ofs); 
 oa & o;
}

Entity * loadObjectFromFile(const char * filename) {
 std::ifstream ifs(filename);
 boost::archive::text_iarchive ia(ifs);
 Object * o;
 ia & o;
 return o;
}

当我序列化到一个文件时,会在其中写入以下文本,其中数字17是存储在objectType变量中的整数值。

22 serialization::archive 10 0 0 17

但是,当我读取此文件时,serialize方法会将值17作为version参数接收,并为objectType分配错误的值{{1} }。

如果我在保存和加载之前手动更改类版本(o.objectType = -858993460),我会收到运行时异常。写入使用111版本号,但读取文件失败。

奇怪的是,如果我使用xml存档,则不会出现问题。 如果我选择序列化整数而不是枚举,问题是一样的。 好像text_iarchive正在寻找(和读取)一个额外的参数,而这个参数不是由text_oarchive提供的,因此17被读作版本号。

我正在使用Boost 1.55和Visual Studio 2013。

欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

你在这里犯了一个标准错误:序列化一个OBJECT(类型为Entity),但是你试图反序列化一个指针。你应该使它一致(OBJECT-OBJECT或POINTER-POINTER)。

似乎你没有讲述整个故事,你的类Entity是某个类层次结构的基础。在这种情况下,您可能应该使用POINTER的序列化;此外,您将需要此处描述的方法:Boost Serialization: pointer conainer to <BASE> contains various of DERIVED objects