Исключение Protobuf - ссылка на объект не установлена ​​на экземпляр объекта

Я пытаюсь сериализовать свой класс ниже, используя protobuf, но он терпит неудачу с ошибкой "Ссылка на объект". более подробная информация, как показано ниже. Любая идея, что может быть не так, глядя на детали ошибки? Примечание. Объект "Мой пользователь" слишком велик, и у него так много дочерних объектов и свойств. Так что не добавляйте детали класса User здесь.

[ProtoContract]
public class MyPrincipal
{

    public MyPrincipal(string Id, int myId)
    {
        this.Id = Id;
        this.MyId = myId;
        this.Principals = new Dictionary<MyPrincipalType, User>();         
    }

    [ProtoMember(1)]
    public string Id { get; set; }


    [ProtoMember(2)]
    public int MyId { get; set; }

    [ProtoMember(3)]
    public Dictionary<MyPrincipalType, User> Principals { get; set; }


    public MyPrincipal AddPrincipal(MyPrincipalType principalType, User principalValue)
    {
        this.Principals.Add(principalType, principalValue);
        return this;
    }
}


public enum MyPrincipalType
{
   Test = 0
}

Вот подробности ошибки:

Исключение: {"Ссылка на объект не установлена ​​для экземпляра объекта."}

Внутренняя StrackTrace: в ProtoBuf.Serializers.TagDecorator.get_ExpectedType() в ProtoBuf.Serializers.DefaultValueDecorator..ctor(модель TypeModel, значение объекта по умолчанию, хвост IProtoSerializer) в ProtoBuf.Serializers.MapDecoratorTector IProtoSerializer keyTail, IProtoSerializer valueTail, Int32 fieldNumber, WireType wireType, WireType keyWireType, WireType valueWireType, логическое перезапись списка)

Outer StackTrace: в System.RuntimeMethodHandle.InvokeMethod(объектная цель, аргументы Object[], сигнатура сигнатуры, логический конструктор) в System.Reflection.RuntimeConstructorInfo.Invoke(параметры привязки BindingFlags invokeAttr, Binder, связующего объекта, объекта [], CultureInfo Culture) в системе. Reflection.ConstructorInfo.Invoke (параметры Object[]) в ProtoBuf.Meta.ValueMember.BuildSerializer() в ProtoBuf.Meta.ValueMember.get_Serializer() в ProtoBuf.Meta.MetaType.BuildSerializer().) в ProtoBuf.Meta.RuntimeTypeModel.Serialize(ключ Int32, значение объекта, назначение ProtoWriter) в ProtoBuf.Meta.TypeModel.SerializeCore(средство записи ProtoWriter, значение объекта) в ProtoBuf.Meta.TypeModelialContext () контекст) в ProtoBuf.Meta.TypeModel.Serialize (поток dest, значение объекта) в ProtoBuf.Serializer.Serialize[T](назначение потока, экземпляр T)

Эта проблема только с последней версией Nuget 2.3.0. Когда я использую версию 2.0.0.668, это работает нормально.

1 ответ

Решение

Это ошибка библиотеки, и, на первый взгляд, неприятная. Я зарегистрировал это как проблему.

Существует обходной путь: пока явно отключите обработку "карты" в словаре - добавьте [ProtoMap(DisableMap = true)] в Principals, Код был исправлен, и это должно быть включено в 2.3.1. Я рассмотрю других кандидатов на 2.3.1 и решу, что заслуживает немедленного освобождения - переместив остальных на 2.3.2 (чтобы мы могли поставлять 2.3.1 с этим исправлением как можно скорее).

Другие вопросы по тегам