Десериализация int & type с помощью protobuf-net - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь обновить зависимости устаревшей кодовой базы, чтобы использовать 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 & at ProtoBuf.Meta.TypeModel.ThrowUnexpectedType (Type type) в ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType (ProtoReader читатель, формат DataFormat, тег Int32, тип типа, объект и значение, Boolean skipOtherFields, Boolean asListItem, Boolean autoCreate, Boolean insideList, Object parentListOrType) в ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix (Потоковый источник, Значение объекта, тип Type, стиль PrefixStyle, Int32 Ожидаемое поле, Распознаватель TypeResolver, Int64 & bytesRead, логический & haveObject, Контекст SerializationContext) в ProtoBuf.Serializer.NonGeneric.TryDeserializeWithLengthPrefix (Stream источник, стиль PrefixStyle, распознаватель TypeResolver, объект и значение)

Хотя исключение имеет смысл, я пытаюсь найти способ заставить код работать с новой версией библиотеки без масштабного рефакторинга.

Есть предложения?

EDIT:

MemoryStream содержит 8 байтов после сериализации: new byte[] {10,6,8,255,255,255,255,7}

base64: CgYI/////wc=

1 Ответ

0 голосов
/ 28 апреля 2018

Это никогда не было специально разработанным сценарием, и, честно говоря, я поражен тем, что он когда-либо работал, даже в 1. что-то, но: это похоже на работу:

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

Есть ли какая-то конкретная причина, по которой вы хотите использовать переносной указатель?

...