使用 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

是否有特定原因需要包装指针?