2010-03-14 56 views
7

我將幾個對象序列化爲單個流,但是當我嘗試讀取它們時,我似乎無法獲取除最後一個對象以外的任何內容:使用protobuf-net反序列化當前流位置的類型

ProtoBuf.Serializer.Serialize(stream, postA1); 
ProtoBuf.Serializer.Serialize(stream, postB1); 
stream.Position = 0; 
var postA2 = ProtoBuf.Serializer.Deserialize<Post>(stream); 
var postB2 = ProtoBuf.Serializer.Deserialize<Post>(stream); 

第一個反序列化將流移動到末尾,postA2包含postB1的值,而postB2只是一個未初始化的實例。這是預期的行爲,如果是這樣,你如何從一個流中的隨機位置反序列化一個對象?

回答

8

通過默認,protobuf的(在谷歌規範,不proobuf網專)的設計,讓您將連續的消息作爲單個對象的一部分 - 即你可以簡單地通過連接,添加到信息領域,其基本上就是你在這裏做的。每個頂級對象都沒有(默認情況下)有任何類型的下一個對象的分離。

爲了得到它把它們看作不同的對象,看看*WithLengthPrefix方法(或者可以使用IEnumerable<T>版本 - 也許DeserializeItems;還要注意,它會自動應用長度前綴,如果你給它像一個列表序列化的東西);例如:

本質:

Serializer.SerializeWithLengthPrefix(stream, postA1, PrefixStyle.Base128, 1); 
Serializer.SerializeWithLengthPrefix(stream, postB1, PrefixStyle.Base128, 1); 
stream.Position = 0; 
var postA2 = Serializer.DeserializeWithLengthPrefix<Post>(stream, 
    PrefixStyle.Base128, 1); 
var postB2 = Serializer.DeserializeWithLengthPrefix<Post>(stream, 
    PrefixStyle.Base128, 1); 
+0

正是我一直在尋找。我沒有看到DeserializeWithLengthPrefix從看過的內容。謝謝 –