2009-11-27 65 views
3

是否有支持部分序列化的現有C++序列化庫?支持部分序列化的C++序列化庫?

通過「局部串行」我的意思是,我可能要保存的3個特定成員的值,以後還可以到保存的副本適用於不同的實例。我只會更新這3個成員,並保留其他成員。

這對於通過網絡同步數據很有用。假設我在客戶端和服務器上有一些對象,並且當服務器上的成員發生更改時,我想向客戶端發送一條消息,其中包含該成員的更新值,該成員僅爲。我不想通過電線發送整個對象的副本。

boost::serialization一眼看起來像它僅支持全有或全無。

編輯:3年後最初寫這個我回頭看它,我對自己說,「武漢理工大學?」 boost :: serialization可以讓你定義你想要保存或不保存的成員,所以它會支持'部分序列化',正如我似乎已經描述的那樣。此外,由於C++缺乏反射序列化庫,因此要求您明確指定要保存的每個成員,除非他們帶有某種外部工具來解析源文件或具有用於生成C++代碼的單獨輸入文件格式(例如什麼協議緩衝區)。我認爲我寫這篇文章時一定會在概念上感到困惑。

回答

4

你很顯然沒有在這裏尋找序列化。

序列化是有關保存的對象,然後從字節流重新創建它。認爲視頻遊戲保存或Web服務器的會話上下文。

這裏你需要的是消息。 Google's FlatBuffers對此很好。在接收到消息時指定一個將包含每個字段作爲可選字段的消息,使用存在的字段更新您的對象,並保持其他字段不變。

FlatBuffers最棒的地方在於,它能夠很好地處理向前和向後兼容性,以及文本和二進制編碼(文本對於調試非常有用,二進制對於純性能更好),在零成本解析步驟之上。

你甚至可以用另一種語言解碼的消息(比如Python或Ruby),如果你的地方保存,並希望一起扔一個HTML GUI來檢查它!

+0

我不會說我「顯然不想要序列化」。也許序列化庫通常不會考慮這種用例,但我認爲這是完全序列化的一個非常自然的擴展,希望能夠僅保存對象成員的一個子集。通過網絡發送數據只是一種可能的用例。 –

+0

我的意思不是迂腐,但序列化是關於保存足夠的信息,以便能夠從中重建語義相同的克隆。這些屬性的子集可能就足夠了(如果可以計算其餘的)。然而在這裏,我們有一個不同的案例:它真的是更多的觀察者模式。觀察者模式實際上是關於溝通......所以我們正在談論事件(或消息)。是否涉及網絡並不重要(儘管它有點複雜)。 –

+0

我的意思並不是迂腐,但是如果序列化節省了足夠的信息來創建語義相同的克隆,部分序列化可以節省足夠的信息以創建部分語義相同的「克隆」;)或者相同,比原來窄)的觀點。 –