2011-02-24 133 views
6

我有一個問題關於serializaton數據結構。數據結構的序列化有很多種可能(也稱爲編組縮減,參見wiki-article)。每種編程語言,框架,標準或庫似乎都帶有自己的序列化方法。許多人還定義了他們自己的數據/接口描述語言(我更喜歡僅在代碼內定義的語言依賴數據結構)。只是僅舉幾例(見wiki-article):COM IDL,CORBA IDL,節儉IDL,谷歌協議緩衝 「.proto」,XSD,ASN.1 IDL,等等。其中一些序列化能夠生成語言原生數據結構和用於序列化和反序列化這些結構的代碼。易於使用的可擴展序列化/編組?

我做了關於這個問題的一些研究,但我仍然未定。所以我的問題是: 我應該使用哪種序列化?

我要求擴展,空間效率(至少二進制),高效地訪問數據,安心使用(可能與所生成的代碼和吸氣劑和setter)和C++ - 保持兼容。

可擴展性應提供向前和向後兼容性。更具體地說,我寫的數據格式通常會隨着時間的推移而增長,因爲我添加了新的數據字段,這在開發之初我無法預見。現在,我希望能夠使用較新的軟件版本讀取過時格式的存儲數據,舊的存儲數據中找不到的數據字段可以使用默認值或其他值填充。另一方面,我希望能夠讀取使用新描述書寫的數據。未知數據字段應該被用「舊」數據描述編譯的軟件忽略(可能會產生一些警告)。

任何推薦?關於該主題的進一步閱讀推薦,也將不勝感激。

---編輯---

1)的boost ::序列化似乎是相當受歡迎的。 它有一些非常好的功能,文檔非常好,諺語似乎很直截了當。也許我有點挑剔,但也有一些我不喜歡的東西:我不明白它如何處理向前兼容(見4)。我寧願生成的代碼。

2)谷歌protobuf似乎適合我的需要更好,但我沒有看着他們的深度。他們似乎很好地處理向前和向後的可塑性(參見5)。他們有用於不同語言的代碼生成器,開發人員知道類似的概念(請參閱FAQ)。我將深入研究protobufs。

3)提升精神似乎並沒有成爲我尋找的東西。

+0

是的,不幸的是前向兼容性缺乏boost :: serialization。另外,在以前的boost :: serialization版本中,我在Mac和PC上生成的XML文件中遇到了一些細微的差異,所以對於該格式的完美兼容性也存在疑問。挖掘Protobuf聽起來像是最好的主意,請告訴它走向何方。 – 2011-03-01 18:59:58

回答

2

我使用了boost的序列化庫一段時間 - 它的可擴展性好,效率高,並支持對每個要序列化的對象進行單獨的版本控制。所有這些特徵當然意味着它是一個複雜的野獸,需要一些時間才能正確地學習。沒有那麼靈活的編譯。如果你試圖把它帶到一個沒有官方支持的平臺上,那麼期望調試一些非常複雜的代碼。各平臺之間的文件兼容性可能會稍微差一點,並且向前兼容性將不起作用。總的來說,如果您需要應用程序實例彼此通信,boost序列化通常不是一個好的選擇。不過,對於正確的項目來說並不是那麼糟糕。

http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/index.html

加速也有一個更通用的解析/輸出較新的精神庫,但我還沒有使用它,並不會推薦它基於第一印象 - 它需要一些挖掘,甚至明白什麼特別命名的圖書館是爲了。最後,對於簡單的項目來說,滾動你自己的序列化庫也許不是一個不錯的選擇 - 它不是太難,你會得到你需要的功能。有點令人失望的是,C++世界似乎還沒有充分解決序列化問題,但這是我上一次決定序列化功能時得出的結論。不過,在一段時間內使用boost的序列化提供了一個很好的想法,即在我自己的實現中應該瞄準什麼。

+0

用於boost :: serialize的+1。 Boost :: spirit用於解析語法。所以你可以使用它來進行序列化,但它會很慢並且很難維護。 – 2011-02-25 12:44:58

+0

是的,我剛剛聽到一些模糊的引用,指出精靈被用於序列化 - 但是,它可能不是正確的工具。 – 2011-02-25 13:27:13

+0

謝謝你的回答。我之前聽說過boost :: serializaton,但沒有深入研究它,現在我會做。也許這對我來說是正確的。 – Metaprogger 2011-02-25 18:13:30

2

的boost ::序列化是偉大

  • 支持不同版本的存檔
  • 的良好支持大多數的數據結構(指針,向量...)
  • 非常快(10秒1GB的這樣的限制是您的硬盤驅動器)
  • 相當容易,如果與升壓用慣
  • 在實時壓縮:: iostreams的

的缺點是:

  • 存檔可能無法從一個。平臺兼容到其他
  • 僅適用於C++,與其他語言

仍保持增長一個不錯的選擇沒有交流,是來自Google的協議緩衝區http://code.google.com/p/protobuf/

  • 與語言無關
  • 版本支持
  • 非常快

所以,如果你想不同的系統之間交換數據,我會去與Protocol Buffers的。但是,如果你有一個單一的應用程序,我會使用boost :: serialize

+0

謝謝你的回答。我可能會有多個應用程序通過網絡進行通信,是boost :: serialize不適合呢? – Metaprogger 2011-02-25 18:26:21

+0

Boost :: serialize具有許多格式,如二進制,文本或XML。如果您使用文本或XML,則不會有任何問題。但是,二進制可能是一個問題。 – 2011-02-25 19:54:43

相關問題