C# 反序列化int&;用protobuf网键入

C# 反序列化int&;用protobuf网键入,c#,protobuf-net,C#,Protobuf Net,我正在尝试升级遗留代码库的依赖项,以使用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.NonGen

我正在尝试升级遗留代码库的依赖项,以使用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:类型不是 预期,但无法推断合同:System.Int32&at ProtoBuf.Meta.TypeModel.ThrowUnexpectedType(类型类型)位于 ProtoBuf.Meta.TypeModel.TryDeserializedAuxiliaryType(ProtoReader 读卡器、数据格式、Int32标记、类型、对象和值, 布尔skipOtherFields、布尔asListItem、布尔自动创建、, 布尔内部列表,对象父列表或类型)位于 ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix(流源, 对象值、类型、前缀样式、Int32 expectedField、, 类型解析程序解析程序,Int64和ByteRead,Boolean和haveObject, 序列化上下文)位于 ProtoBuf.Serializer.NonGeneric.TryDeserializeWithLengthPrefix(流 源、前缀样式、类型解析程序解析程序、对象和值)

尽管这个异常是有意义的,但我正在试图找到一种方法,使代码能够在不进行大规模重构的情况下与库的新版本一起工作

有什么建议吗

编辑:

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


base64:
CgYI/////wc=

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

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

您需要包装指针有什么具体原因吗?

哇,这是一个边缘案例!您知道用于序列化为的字节是什么吗?例如,输出的十六进制或base-64?@MarcGravel我现在已将流输出添加到问题中。谢谢;这些数据是有意义的,因为我们的自定义RPC层,所以我们需要一个包装指针。无论何时发出请求,我们都将参数打包到消息中并序列化它,并对响应消息执行同样的操作。当我们反序列化响应消息时,我们使用反射并获取参数类型。升级后有两个单元测试失败,因为它们专门测试
ref int
out int
参数的序列化/反序列化。谢谢你的回答!