Хитрость здесь в том, чтобы использовать опцию DynamicType = true
для члена до вашего объекта - в качестве упрощенного примера:
[ProtoMember(12, DynamicType = true)]
public object CouldBeAnything {get;set;}
Re "string <===> Type map", то есть событие DynamicTypeFormatting
в TypeModel
. Если вы используете методы Serializer.*
, это ярлык (в основном для сохранения API v1) для экземпляра сериализатора RuntimeTypeModel.Default
.
(как примечание, при написании этого я заметил крайний случай, который мне нужно пойти и исправить в коде)
Примечание: другой подход, вместо использования DynamicType
, заключается в простом конфигурировании модели во время выполнения , например:
var knownTypes = GetMyKnownTypesAtRuntimeWithUniqueIdentifiers();
var metaType = typeModel[typeof(MyBaseClass)];
foreach(var knownType in knownTypes)
{
metaType.AddSubType(knownType.UniqueIdentifier, knownType.Type);
}
IMO, последний вариант - мой предпочтительный , и, как правило, он будет более эффективным. Обратите внимание, что необходимо, чтобы уникальные идентификаторы были фиксированными / повторяемыми, так как это является частью проводного формата (не просто используйте индекс порядка, в котором вы их нашли).