我正在将几个对象序列化为一个流,但是当我尝试将它们读回来时,除了最后一个对象之外我似乎无法得到任何东西:
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只是一个未初始化的实例。这是预期的行为,如果是这样,您如何从流中的随机位置反序列化对象?
答案 0 :(得分:8)
通过默认,protobuf(Google规范,特别是proobuf-net)旨在允许您将连续消息视为单个对象的一部分 - 即您可以简单地将字段添加到消息中通过连接,这基本上就是你在这里所做的。每个顶级对象(默认情况下)都没有任何与下一个对象的分离。
要将它们视为不同的对象,请查看*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);