使用 protobuf-net 反序列化 int& 类型
Deserializing int& type with 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 并抛出:
Unhandled Exception: System.InvalidOperationException: Type is not
expected, and no contract can be inferred: System.Int32& at
ProtoBuf.Meta.TypeModel.ThrowUnexpectedType(Type type) at
ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType(ProtoReader
reader, DataFormat format, Int32 tag, Type type, Object& value,
Boolean skipOtherFields, Boolean asListItem, Boolean autoCreate,
Boolean insideList, Object parentListOrType) at
ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix(Stream source,
Object value, Type type, PrefixStyle style, Int32 expectedField,
TypeResolver resolver, 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
是否有特定原因需要包装指针?
我正在尝试升级遗留代码库的依赖项以使用 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 并抛出:
Unhandled Exception: System.InvalidOperationException: Type is not expected, and no contract can be inferred: System.Int32& at ProtoBuf.Meta.TypeModel.ThrowUnexpectedType(Type type) at ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType(ProtoReader reader, DataFormat format, Int32 tag, Type type, Object& value, Boolean skipOtherFields, Boolean asListItem, Boolean autoCreate, Boolean insideList, Object parentListOrType) at ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix(Stream source, Object value, Type type, PrefixStyle style, Int32 expectedField, TypeResolver resolver, 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
是否有特定原因需要包装指针?