【问题标题】:Deserializing a type at the current stream position with protobuf-net使用 protobuf-net 反序列化当前流位置的类型
【发布时间】:2010-03-14 08:29:52
【问题描述】:

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

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

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    默认,protobuf(Google 规范,不是专门的 proobuf-net)旨在让您将连续消息视为单个对象的一部分 - 即您可以简单地向消息添加字段通过连接,这基本上就是你在这里所做的。每个顶级对象(默认情况下)与下一个对象没有任何种分隔。

    要让它将它们视为不同的对象,请查看 *WithLengthPrefix 方法(或者您可以使用 IEnumerable&lt;T&gt; 版本 - 也许是 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);
    

    【讨论】:

    • 正是我想要的。我没有看到 DeserializeWithLengthPrefix 做了什么。谢谢
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2012-02-27
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多