我将几个对象序列化为一个流,但是当我尝试将它们读回来时,除了最后一个对象之外我似乎无法得到任何东西:
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);
Run Code Online (Sandbox Code Playgroud)
第一个反序列化将流移动到结尾,postA2包含postB1的值,而postB2只是一个未初始化的实例.这是预期的行为,如果是这样,您如何从流中的随机位置反序列化对象?
通过默认情况下,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);
Run Code Online (Sandbox Code Playgroud)