2016-06-10 55 views
0

我想序列化的数据结构大多是对象列表。一个对象可能有一个指向另一个的指针。 串行化失败,指针冲突。 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*>因为升压可以创建元素但是,任何地方都是非常具有侵扰性的。 另一个想法是确保首先创建所有的对象,然后是指针。但我怎么能做到这一点?任何替代品?

回答

1

可以做如下所示: 1)在对象定义一个ID 2)做连载类,使用ID为之后的所有数据的指针 3)当完成时,循环中的所有对象,使ID到实际的指针

如果这仅仅是一个载体,那么你可以忽略对象指针时做串行和deserial,因为你知道它是不断的联系,所以很容易不断地重新连接当通过使前一个对象的临时指针与当前对象链接来反序列化时。

+0

你会用指针运算来计算ID吗,比如'other - &objects [0]'?听起来可行,但需要自定义保存和加载方法。 – SpamBot

+0

是的,当将对象加载到新的应用程序中时,可以建立ID和内存地址之间的映射关系,而其他对象可以使用该ID来查找对象地址(然后将它自己对象),然后构建它们之间的映射。我之前在我的项目中做过这种映射,并且运行良好。 –

0

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

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

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