使用指针增强序列化

Boost serialization with pointers

本文关键字:序列化 增强 指针      更新时间:2023-10-16

我想序列化的数据结构主要是对象列表。一个对象可能具有指向另一个对象的指针。然后,序列化将失败,并出现指针冲突。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) 在对象中定义一个 ID2)序列化类时,使用ID作为指针3)完成所有数据后,循环所有对象以使ID到实际指针

如果这只是一个向量,那么您可以在执行串行和反串行时忽略 Object 指针,因为您知道它是连续链接的,因此在执行反串行时很容易通过将前一个对象的临时指针链接到当前对象来连续重新链接。

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

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

由于Object可能始终在任意位置创建,因此序列化中的顺序无关紧要。缺点是数据结构已更改。在我的应用程序中,这需要对Data的 getter 和 setter 方法进行一些更改。