2009-12-07 60 views
3

我一直在尋找做一些二進制序列化文件和protobuf網似乎是一個表現良好的選擇。不過,我有點卡住了。因爲我想脫鉤我不使用屬性,但是那些選擇了與.proto文件從實際序列化類的定義,我已經得到了對象的結構下(我認爲)序列化使用Protobuf網對象列表

message Post { 

    required uint64 id = 1; 

    required int32 userid = 2; 

    required string status= 3; 

    required datetime created = 4; 

    optional string source= 5; 

} 

(是datetime有效或應該使用ticks作爲int64?)

但我堅持如何使用protogen,然後序列化一個IEnumerable的Post到文件並閱讀回來。任何幫助,將不勝感激

另一個相關的問題,是否有檢測損壞的二進制文件,任何的最佳做法就像在序列化

+0

嗨Mattias,這裏沒有批評意圖,但我很好奇你爲什麼會問這裏,而不是相當活躍的Protocol Buffers論壇:http://groups.google.com/group/protobuf?pli=1 ? – BillW 2009-12-07 06:28:48

+5

@BillW - 這很好,當然?這是一個編程問題,作者在這裏相當活躍,我相信... – 2009-12-07 07:26:38

回答

2

重新DateTime如果計算機關機...這標準原型;我添加了一個BCL.DateTime(或類似的)到我自己的庫中,它旨在匹配protobuf-net用於DateTime的內部序列化,但我相當肯定我還沒有(還)更新了代碼生成器將其視爲一種特殊情況。如果你想讓我試試,這將是相當容易的。如果你想要最大限度的便攜性,一個「滴答」風格的方法可能是實用的。讓我知道...

重新序列化爲一個文件 - 如果應該大致與Getting Started示例相同,但請注意protobuf-net想要使用它可以重建的數據; 只是IEnumerable<T>可能會導致問題 - IList<T>應該沒問題,但(在重建時它將默認爲List<T>作爲具體類型)。

重新腐敗 - 也許使用SerializeWithLengthPrefix - 它甚至可以在消息邊界(它們無法作爲EOF檢測到的地方)檢測到問題。這(顧名思義)首先寫入長度,所以它知道是否有足夠的數據(通過DeserializeWithLengthPrefix)。或者,保留文件中的第一個[n]個字節作爲散列/校驗和。寫這個空白的spacer,然後數據,計算散列/校驗和,並覆蓋開始。在反序列化過程中驗證。更多的工作。

+0

嗨馬克,感謝您的答案。我想知道的是關於Post文件列表的.proto文件聲明(而不是屬性),然後如何使用protogen和生成的類...沒有看到任何示例 嗯,也許我可以把一個虛擬始終在文件中保留一定的值,如果不存在則返回上一次備份 – Homde 2009-12-07 08:50:24