使用指针促进序列化

Boost serialization with pointers

我想序列化的数据结构主要是一个对象列表。一个对象可能有一个指向另一个的指针。 然后序列化因指针冲突而失败。 http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/exceptions.html#pointer_conflict

这是我的数据结构的一个最小示例:(我的真实结构更复杂。)

struct Data
{
  std::vector<Object> objects;
}
struct Object
{
  std::string name;
  Object *other;
}

我可以解决将列表元素更改为指针的问题 std::vector<Object*> 因为 boost 然后可以在任何地方创建元素,但是,这是非常具有侵入性的。 另一个想法是确保首先创建所有对象,然后再创建指针。但我怎样才能做到这一点?还有其他选择吗?

您可以执行以下操作: 1) 在Object中定义一个ID 2) 序列化 class 时,使用指针的 ID 3)所有数据完成后,循环所有对象使ID指向实际指针

如果这只是一个向量,那么你可以在进行串行和反串行时忽略对象指针,因为你知道它是连续linked,所以它通过将前一个对象的临时指针link编辑到当前对象,在进行反序列化时很容易连续重新link。

我终于通过对多次引用的所有数据使用(智能)指针解决了我的 pointer_conflict 问题。

struct Data
{
  std::vector< std::unique_ptr<Object> > objects;
}
struct Object
{
  std::string name;
  Object *other;
}

因为 Object 可能总是在任意位置创建,所以序列化的顺序无关紧要。 缺点是数据结构发生了变化。在我的应用程序中,这需要对 Data 的 getter 和 setter 方法进行一些更改。