2016-06-10 112 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方法進行一些更改。