Если вы не можете указать подтипы в атрибутах (поскольку они не известны во время компиляции), у вас есть 2 варианта (оба из которых применяются только к «v2», доступному как бета-версия):
- использовать
RuntimeTypeModel
вместо статических Serializer
методов (которые теперь просто сокращены до RuntimeTypeModel.Default
); рассказать модели о наследовании (пример ниже)
- добавить
DynamicType = true
к [ProtoMember(...)]
в вопросе
Второй - не очень чистый протобуф - он встраивает информацию о типах, которую я на самом деле не люблю , но люди просто хранят просить. Первый мой предпочтительный вариант. Чтобы добавить подтипы во время выполнения:
var model = TypeModel.Create();
var type = model.Add(typeof(YourBaseType), true);
var subTypeA = model.Add(typeof(SomeSubType), true);
var subTypeB = model.Add(typeof(SomeOtherSubType), true);
type.AddSubType(4, typeof(SomeSubType));
type.AddSubType(5, typeof(SomeOtherSubType));
true
в вышеприведенном означает «использовать обычные правила для автоматического добавления свойств элементов» - вы также можете взять это под свой контроль и указать свойства (и т. Д.) Вручную, если хотите.
Обратите внимание, что TypeModel
следует кэшировать и использовать повторно (не создавать для объекта, который необходимо сериализовать), поскольку он включает в себя некоторый код "emit" для генерации методов. Повторное использование будет быстрее и потребует меньше памяти. Модель типов является поточно-ориентированной и может использоваться для сериализации / десериализации нескольких потоков одновременно в разных потоках.