Сбой десериализации после переключения PrefixStyle на Fixed32

StackOverflow https://stackoverflow.com/questions/1477526

  •  16-09-2019
  •  | 
  •  

Вопрос

У меня есть набор тестов для коммуникационной библиотеки, которую я разрабатываю, используя protobuf-net это работает нормально.Все тесты пройдены.Но если я изменю PrefixStyle с Base128 на Fixed32, десериализация завершится неудачей.

Исключение, которое я получаю от TryDeserializeWithLengthPrefix функция - это:


System.ArgumentNullException was caught
  Message="Value cannot be null.\r\nParameter name: type"
  Source="protobuf-net"
  ParamName="type"

Все просто работает, если я просто сохраняю PrefixStyle.Base128 при сериализации и десериализации сообщения.

Кто-нибудь знает, что может происходить?

Это было полезно?

Решение

Хохум, да, выглядит как жук (теперь зарегистрирован);повторяемый пример ниже.Я посмотрю, смогу ли я починить это в поезде (в ближайшее время).Извини за это:

using System;
using System.IO;
using ProtoBuf;
[ProtoContract]
public class Strange // test entity
{
    [ProtoMember(1)]
    public string Foo { get; set; } // test prop
    [ProtoMember(2)]
    public int Bar { get; set; } // test prop

    static void Main() {
        var original = new Strange { Foo = "abc", Bar = 123 };
        // serialize and deserialize with base-128
        using (MemoryStream ms = new MemoryStream()) {
            Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Base128,1);
            ms.Position = 0;
            object obj;
            Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
                PrefixStyle.Base128, i => typeof(Strange),out obj);
            var clone = (Strange)obj;
            Console.WriteLine("Foo via Base128: " + clone.Foo); // works fine
            Console.WriteLine("Bar via Base128: " + clone.Bar);
        }
        // serialize and deserialize with fixed-32
        using (MemoryStream ms = new MemoryStream())
        {
            Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Fixed32,1);
            ms.Position = 0;
            object obj;
            // BOOM here; oh how embarrassing
            Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
                PrefixStyle.Fixed32, i => typeof(Strange), out obj);
            var clone = (Strange)obj;
            Console.WriteLine("Foo via Fixed32: " + clone.Foo);
            Console.WriteLine("Bar via Fixed32: " + clone.Bar);
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top