2013-05-10 51 views
1

作爲練習,我正在用幾種語言實現一個UBJson串行器。我的問題是:是否有一種慣用的方式來使用C++來自定義格式讀寫器?例如,我想實現另一個boost :: serialization歸檔類型。如何實現一個C++序列化器的慣用方式?

更多詳細信息:type-in​​trospection部分不是問題 - 如果我曾經使用過我的實現,它將替換已經存在的json序列化程序。我也理解遞歸序列化的概念。真正的問題是:我應該創建readInt,writeString方法還是隻創建兩個模板化讀寫方法,或者......?

回答

1

嗯我不知道任何慣用的方法,但我知道的標準策略是隻有序列化最簡單的類型。可以遞歸地將複雜對象分解爲更簡單的片段,直到找到基類POD類型,如int,char *,float。然後創建這些基類型的手工序列化例程。

更復雜類型的序列化涉及這種遞歸類型的自省,導致從較小的序列化例程中建立更大的序列化例程。

然而,這種方法在C++中需要某種形式的內省,這比串行化本身要複雜得多。這裏有一篇文章我寫在這個主題上:http://www.randygaul.net/2013/01/05/c-reflection-part-5-automated-serialization/

有兩種主要的方法來編寫實際的序列化例程。第一種方法是創建一個輸入/輸出採用bool的單個序列化函數。

void Serialize(type instance, bool input); 

的第二種方式是寫輸入和輸出作爲單獨的函數(我自己喜歡):

void Serialize(type instance); 
Variant Deserialize(type info); 

模板序列化例程,或者僅僅提供特定的過載是偏好的問題。

+0

謝謝你的回答 - 我更新了我的問題,這太方便了。 – gracchus 2013-05-10 18:36:16

+0

@gracchus我明白了。那麼我對此的迴應就是做你喜歡的事情。通常,只要流或文件對象支持所有必需基類型的重載,模板化的「POD」序列化程序就可以工作。我自己喜歡'fprintf',所以我專門研究了所有的基本例程。我嘗試更新我的答案,以更好地回答你的問題。 – RandyGaul 2013-05-10 18:37:39

相關問題