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

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

最佳答案

默认情况下,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);

关于c# - 使用 protobuf-net 在当前流位置反序列化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441608/

相关文章:

c# - 标签透明底色

c# - LINQ Group By 多表Inner Join 和聚合函数

c# - 具有空值的 ASP.NET MVC 属性路由

c++ - C++ 中的 Protobuf ParseDelimitedFrom 实现

asp.net-core - protobuf-net.grpc 客户端和 .NET Core 的 gRPC 客户端工厂集成

c# - ASP.NET Core 中的 Request.InputStream

C# 打印屏幕事件窗口

protobuf-net - 如何指定不序列化的默认值

c# - 序列化数据太大

protobuf-net - 我可以使用 protobuf-net 序列化任意类型吗?