我正在尝试升级遗留代码库的依赖关系以使用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=
答案 0 :(得分:1)
这从来就不是一个特别设计的场景,坦率地说,我很惊讶它曾经有效,即使在1.something,但是:这似乎有效:
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int), out var lastItem);
Console.WriteLine(lastItem); // lastItem is a boxed int
您是否需要包装指针?