ProtoBuf-Net, сериализация / десериализация открытых универсальных типов - PullRequest
2 голосов
/ 05 февраля 2012

У меня есть следующий тип:

Class Command<TData> : Base Where TData : I

Во время выполнения этот класс является сборкой (с определенным TDATA) и сериализованным. У меня есть 2 проблемы (я использую V2): 1) Когда я добавляю этот тип в модальное время выполнения:

var meta = this._modal.Add(type, false)
                             .Add(this.GetDMProperties(type).Select(p => p.Name)
                             .ToArray());

Я получаю следующее исключение:

Необработанное исключение: System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в ProtoBuf.Meta.TypeModel.ResolveProxies (Type type) в C: \ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs: строка 952 в ProtoBuf.Meta.RuntimeTypeModel.FindWithoutAdd (Type type) в C: \ Dev \ protobuf-net \ protobuf-net \ Meta \ RuntimeTypeModel.cs: строка 118 в ProtoBuf.Meta.ValueMember..ctor (модель RuntimeTypeModel, тип parentType, Int32 fieldNumber, член MemberInfo, тип memberType, тип itemType, тип defaul tType, DataFormat dataFormat, Object defaultValue) в C: \ Dev \ protobuf-net \ protobuf-net \ Meta \ ValueMember.cs: строка 75 в ProtoBuf.Meta.MetaType.AddField (Int32 fieldNumber, String memberName, Тип itemType, Тип defaultType, Объект defaultValue) в C: \ Dev \ protobuf-net \ protobu f-net \ Meta \ MetaType.cs: строка 1165 в ProtoBuf.Meta.MetaType.Add (String [] memberNames) в C: \ Dev \ protobuf-net \ protobuf-net \ Meta \ MetaType.cs: строка 1046

2) Если я попытаюсь пропустить его при запуске и попытаться сделать это по требованию, как показано ниже:

if (this._modal.CanSerializeContractType(objectType) == false)
            {
                this._modal.Add(objectType, false);
                this._modal.CompileInPlace();
            }

CanSerializeContractType возвращает true, но на практике сериализуются только базовые данные.

У меня вопрос, какова практика добавления этого типа в модальное без добавления всех перестановок во время разработки, если это возможно?

1 Ответ

0 голосов
/ 05 февраля 2012

мне придется исследовать первое;звучит как странный баг.Однако, ваш второй пункт связан с беседой, которую я имел недавно - с выводом, что я добавлю событие, которое запускается, когда тип впервые виден.Тогда у вас будет возможность во время события настройки типа.В теории: просто;Мне просто нужно это реализовать.Я «перешлю» это в моем списке вещей ...

Примечание: если вы не работаете только внутри одного домена приложений и не записываете на диск или не отправляете по сети или между процессами, вы must убедитесь, что вы можете надежно добавлять свойства / типы солнца с теми же клавишами.Или, более конкретно: для вашего метода GetDMaproperties (не показан) требуется какой-то фиксированный порядок, или вам нужен OrderBy в LINQ.Также;это хрупко - если кто-то добавляет / удаляет / переименовывает свойство, ключи меняются.

...