2014-01-28 75 views
0

我有代碼看起來像這樣:升壓系列化

struct DataStruct 
{ 
// some fields here 
}; 

class C1 
{ 
public: 
    C1(size_t n) 
    { 
     ptrData = new DataStruct[n]; 
     ptrPtrs = new DataStruct*[n]; 
     for(size_t i=0;i<n;i++) 
      ptrPtrs[i] = &ptrData[i]; 
    } 

    virtual ~C1() 
    { 
     delete[] ptrData; 
     delete[] ptrPtrs; 
    } 

    DataStruct* ptrData; 
    DataStruct** ptrPtrs; 
}; 

並且需要它最好由升壓::序列化序列化。我沒有找到方法來保存動態分配的數組,除了逐項保存在循環中。但不知道如何保存第二個數組 - 指針數組。是否有可能通過增加或多或少的便利方式來實現?

回答

2

不可能讓boost知道元素的數量,因爲你擁有的只是一個指針。堆管理器知道有多少元素,當你調用delete []刪除,但它不提供給編碼就像boost::serialize

當然最好的辦法是首先使用std::vector,但做不到這一點,創建一個「包裝」類,可用於序列化,入站和出站。

如果我們把它叫做ArrayWrapper和模板它

template< typename T > 
struct ArrayWrapper 
{ 
    T* data = nullptr; 
    size_t size = 0; 
    ArrayWrapper() = default; 
    ArrayWrapper(T* data_, size_t size_) : data(data_), size(size_) {} 
}; 

現在你可以先寫大小,則每個項目一個序列化從一個指針和已知的大小。

當序列化回來,你先讀的大小,然後分配對象的數目,然後閱讀它們。

當然,你需要管理你的內存,並使用std::vector是一個更好的選擇。

一般而言,您不會存儲指向您存儲指向的數據的「指針」。當從檔案中讀回時,你不會得到相同的指針,你會得到相同的數據。

爲此目的,你實際上只是歸檔外部的一個(指針數組),並讓它在內部調用ArrayWrapper。

+0

好吧,我希望序列化有某種適配器允許指定數組長度,就像我在上面的回答中一樣。 vector不是一個選項,因爲我記得它不能保證哪些元素不會被內部移動,所以不可能存儲指向vector元素的指針。 – ilya

+0

如果您不以任何方式修改矢量的大小,則不會移動您的矢量元素,並且如果您保留在前面,它將永遠不會移動它們。 – CashCow

+0

您還可以存儲智能指針的向量。即使向量中的元素移動,它們指向的項目也不會移動,並且您的智能指針將保持有效。你可以使用shared_ptr來做這件事,如果你小心的話,可以使用unique_ptr,但不要使用auto_ptr。 – CashCow