7

我将几个对象序列化为一个流,但是当我尝试将它们读回时,除了最后一个对象之外,我似乎什么也得不到:

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

4

1 回答 1

8

默认情况下,protobuf(谷歌规范,而不是专门的 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);
于 2010-03-14T08:44:38.897 回答