使用protobuf-net反序列化当前流位置的类型

时间:2010-03-14 08:29:52

标签: c# 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只是一个未初始化的实例。这是预期的行为,如果是这样,您如何从流中的随机位置反序列化对象?

1 个答案:

答案 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);