динамическое изменение ProtoBuf.Meta.MetaType путем вызова AddSubType создает исключение - PullRequest
1 голос
/ 24 января 2012

Я пытаюсь использовать ProtoBuf-Net для создания независимого от типа сериализатора, который сериализует экземпляры ранее неизвестных типов. Для этого я использую ProtoBuf.Meta.RuntimeTypeModel, динамически добавляя типы объектов, предоставленных моему универсальному сериализатору. При добавлении типа я рекурсивно добавляю полную иерархию типов с помощью отражения: я добавляю типы, вызывая myTypeModel.Add (type, true) и myBaseTypeMetaType.AddSubType (subTypeIndex, type)

Это работает нормально, за исключением случаев, когда я уже использовал сериализатор для сериализации типа, а затем попытался добавить подтип к этому типу. Затем я получил InvalidOperationException: «Тип не может быть изменен после создания сериализатора для Serialization.Test.Address»

Я попытался установить для свойства auto-compile модели значение false, но это не решило мою проблему.

Мое понимание проблемы состоит в том, что по умолчанию protobuf-net создает сериализатор для типа всякий раз, когда он должен сериализовать тип, и после этого ProtoBuf.Meta.MetaType не может быть изменен. Это правильно?

Я что-то не так делаю?

Есть ли другой способ достичь моих целей?

Спасибо за вашу помощь.

Louis

1 Ответ

0 голосов
/ 24 января 2012

Он действительно хочет знать типы заранее - иначе как он мог знать, что он может десериализоваться, например.Кроме того, обратите внимание, что при использовании индекса важно, чтобы вы могли надежно генерировать тот же ключ / тип сопоставления, когда вы хотите десериализовать те же данные.

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

Третий и самый простой вариант, конечно: знать типызаблаговременно.В конце концов - если у вас нет известного / фиксированного определения, возможно, будет невозможно воспроизвести ваши данные позже.

...