反序列化int&用protobuf-net打字

时间:2018-04-27 13:01:16

标签: 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.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int).MakeByRefType(), out var lastItem);
Console.WriteLine(lastItem);

但是相同的代码不能与protobuf-net 2.3.7一起使用并抛出:

  

未处理的异常:System.InvalidOperationException:类型不是   预计,不能推断合同:System.Int32&在   ProtoBuf.Meta.TypeModel.ThrowUnexpectedType(Type type)at   ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType(ProtoReader   reader,DataFormat格式,Int32标签,Type type,Object&值,   Boolean skipOtherFields,Boolean asListItem,Boolean autoCreate,   Boolean insideList,Object parentListOrType)at   ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix(流源,   对象值,类型类型,PrefixStyle样式,Int32 expectedField,   TypeResolver解析器,Int64& bytesRead,Boolean& haveObject,   SerializationContext context)at   ProtoBuf.Serializer.NonGeneric.TryDeserializeWithLengthPrefix(流   source,PrefixStyle style,TypeResolver resolver,Object&值)

虽然异常是有道理的,但我试图找到一种方法来使代码与新版本的库一起工作,而无需进行大规模的重构。

有什么建议吗?

编辑:

序列化后

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

base64:CgYI/////wc=

1 个答案:

答案 0 :(得分:1)

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

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

您是否需要包装指针?