protobuf-net v2 type meta - PullRequest
       27

protobuf-net v2 type meta

3 голосов
/ 15 июля 2011

Согласно этой публикации (с марта), protobuf v2 позволяет нам разрешать типы из потока.Поскольку v2 сейчас находится в бета-версии 5, я думаю, что эта функция уже реализована, поэтому мне было интересно, как использовать эту новую функцию.Я не смог найти никакой документации по этому вопросу, поэтому некоторая помощь будет принята с благодарностью!

Тип meta

Сериализация в порядке, ноЯ не знаю (и не могу знать) все мои типы заранее.Как я могу это сделать?

Ну, protobuf - это контрактный формат;если вы не знаете типы, он будет бороться - как и любой сериализатор на основе контракта ...

Да, я понял;Теперь: как мне это сделать?

Теперь я отложил любую мета в потоке по разным причинам:

он выходит далеко за пределы основного протобуфаСпек, он мигает предупреждающими знаками BinaryFormatter, моего заклятого врага. Но так много людей, кажется, хотят этого, что я думаю, что мне придется пристегнуться;но на моих условиях!Поэтому в v2 я добавляю возможность указывать, что (для каждого члена) объекты должны разрешать информацию своего типа из потока.По умолчанию, встраивая имя, определенное сборкой, но предоставляя слой абстракции поверх этого, позволяя вам предоставить собственную строку типа <===> карты типов (и, таким образом, избегать узлов в животе, вызванных слишком большой зависимостью типов).

1 Ответ

2 голосов
/ 15 июля 2011

Хитрость здесь в том, чтобы использовать опцию 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, последний вариант - мой предпочтительный , и, как правило, он будет более эффективным. Обратите внимание, что необходимо, чтобы уникальные идентификаторы были фиксированными / повторяемыми, так как это является частью проводного формата (не просто используйте индекс порядка, в котором вы их нашли).

...