首页 > 解决方案 > 使用 protobuf-net 反序列化 int& 类型

问题描述

我正在尝试升级旧代码库的依赖项以使用 protobuf-net 2.3.7 而不是 protobuf-net 1.0

以下代码用于使用版本 1 并打印2147483647

var stream = new MemoryStream();
Serializer.NonGeneric.SerializeWithLengthPrefix(stream, int.MaxValue, PrefixStyle.Base128, 1);
stream.Position = 0;

Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int).MakeByRefType(), out var lastItem);
Console.WriteLine(lastItem);

但是相同的代码不适用于 protobuf-net 2.3.7 并抛出:

未处理的异常:System.InvalidOperationException:类型不是预期的,并且无法推断出任何合同:ProtoBuf.Meta.TypeModel.ThrowUnexpectedType(类型类型)的 ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType(ProtoReader 阅读器,DataFormat 格式,Int32)的 System.Int32&标签,类型类型,对象和值,布尔skipOtherFields,布尔asListItem,布尔自动创建,布尔insideList,对象parentListOrType)在ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix(流源,对象值,类型类型,PrefixStyle样式,Int32预期字段,TypeResolver解析器, Int64& bytesRead, Boolean& haveObject, SerializationContext context) at ProtoBuf.Serializer.NonGeneric.TryDeserializeWithLengthPrefix(Stream source, PrefixStyle style, TypeResolver resolver, Object& value)

尽管异常是有道理的,但我正在尝试找到一种方法使代码与新版本的库一起使用,而无需进行大量重构。

有什么建议么?

编辑:

MemoryStream序列化后包含 8 个字节: new byte[] {10,6,8,255,255,255,255,7}

base64:CgYI/////wc=

标签: c#protobuf-net

解决方案


这从来都不是一个专门设计的场景,坦率地说,我很惊讶它曾经有效,即使在 1.something 中,但是:这似乎有效:

Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int), out var lastItem);
 Console.WriteLine(lastItem); // lastItem is a boxed int

您需要包装指针是否有特定原因?


推荐阅读