2012-10-04 30 views
2

有沒有一種方法來序列化C++中的類?我不是指一個類的實例,而是指類本身。反序列化時,我不知道要實例化哪個類來調用反序列化。我希望能夠以某種方式確定正在表示什麼類,實例化它的一個空實例,然後調用反序列化它。在C++中序列化一個類

編輯澄清:

我創建一個鍵值結構,其中每個按鍵都有一個強類型值。 (有些鍵必須存儲一個字符串,其他鍵必須存儲整數,還有一些鍵可以存儲任意值)。我已經設計了一個系統,通過模板來實現這一點。

Key類有兩個模板參數:

  • UniqueClass - 應該有每概念
  • 值類型(通常在定義的概念的預處理器的功能所定義的)一個唯一的類 - 這是類該值必須符合這個概念

Value類是一個模板類,只有ValueType具有抽象超類,這樣我就可以包裝任何類(類似於boost :: any)。

然後在我的鍵值結構我有存儲和檢索的模板與ConceptType和值類型的功能:

template<UniqueClass, ValueType> 
void store(Concept<UniqueClass, ValueType> concept, ValueType value); 

因爲我使用的是相同的模板來描述概念的價值型和如果它們不匹配,則編譯器會報告傳入的值。

我現在想要能夠序列化鍵值存儲。因此,我需要以某種方式序列化模板化的Concept類,然後在反序列化過程中實例化正確的任意類。

我有它,以便我可以調用序列化,並要求所有適當的對象序列化自己,我只是不知道在反序列化期間要實例化什麼類要求反序列化自己。

+0

請解釋「serialize a class」的含義。序列化什麼,定義(方法/領域)?靜態成員? – cdhowie

+0

顯示您正在嘗試工作的一些非工作代碼。 –

+0

你的問題並不是很清楚,但你似乎在尋求兩個不同的東西。 1)如何確定要反序列化的類的類型(這需要一些序列化的元數據並可以使用某種類型的工廠模式)以及2)如何實際序列化內容(可以通過多種方式完成)。這裏有一些例子可以讓你開始:http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html – Chad

回答

3

回答更新由於問題編輯:

我的理解是,你必須在容器0鍵,直到您手動或通過反序列化添加。有兩種方法可以做到這一點:侵入性和非侵入性。

侵入

讓從DeserializableConcept<U,T>繼承:

class Deserializable 
{ 
    public: 
     virtual void deserialize(InputStream& s) = 0; 
     virtual int getClassId() const = 0; 
}; 

現在,你可以通過它的ID,使用getClassId()檢索識別一類。所以,接下來要創建一個工廠。在這裏,我將使用一個非常簡單的例子,用std::map來說明這一點。隨意使用更復雜的。

typedef Deserializable* (*createDeserializableType)(); 
std::map<int,createDeserializableType> factory; 

// ... 

factory[id1] = &createMyClass; 
// etc... 

// ... 

// On deserialization 
createDeserializable create = factory[idReadFromStream]; 
if(create) 
    create()->deserialize(input_stream); 

這意味着要麼你必須添加一個store方法Deserializable或添加一個store方法Deserializable(我個人比較喜歡最後一個方法)。

非侵入式

的想法是反序列化鍵值要創建它,將它添加在同一時間:

typedef void (*deserializeFctType)(InputStream&); 
typedef int id_type; 
std::map<id_type,deserializeFctType> factory; 

deserialize方法後立即保存反序列化的類型創造它。

在你的問題中有什麼不明確的是接受清單的列表是有限的還是無限的。只有一組有限的類型是「容易」可序列化的。

+0

好的答案,正是我要建議的(所以現在,我沒有):) – Chad