c# - 使用 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=
解决方案
这从来都不是一个专门设计的场景,坦率地说,我很惊讶它曾经有效,即使在 1.something 中,但是:这似乎有效:
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int), out var lastItem);
Console.WriteLine(lastItem); // lastItem is a boxed int
您需要包装指针是否有特定原因?
推荐阅读
- php - PHP:除了第一个表单之外,多个表单都不起作用?
- google-maps - 创建特定街道获得特定颜色的自定义地图
- python - 在 PyQt5 中获取滚动条拇指的大小/宽度?
- c++11 - __int64' 后跟 'int64' 是非法的
- dart - Flutter 获取列表值到另一个列表
- javascript - 如何使用 jQuery 和 Bootstrap 在文档中创建多个模式?
- micronaut - Micronaut Swagger Groovy 不生成 openapi yaml 文件
- python - 如何比较熊猫中两个相关数据框的两列
- android - 如何在不从 Android 应用程序中获取视频数据的情况下安全地解密 Android 中的视频数据
- javascript - React Native 与 react-navigation 和 Redux - 如何实现全局可用的“退出”按钮