Как добавить класс в protobuf-net

#c# #serialization #protobuf-net

#c# #сериализация #protobuf-net

Вопрос:

я использую protobuf-net, и пока мне это нравится, но одна вещь не дает мне покоя. У меня есть класс, который я хотел бы использовать в сообщении, но его нет в моем исходном коде.

вот так:

 [ProtoContract]
class Test{ 
    [ProtoMember(1)]
    public Otherclass Attr {get;set}
}
  

но ProtoBuf не знает, как сериализовать Otherclass, и я не могу получить доступ к его коду.
Итак, мне нужно рассказать, как это сделать, но как?

Ответ №1:

В версии v1 вы не можете, если только у него нет атрибутов xmlaerializer или datacontractserializer. Ну, это не совсем верно... Есть переключатель GlobalOptions, который теоретически должен работать, но не очень терпим, если меняется тип, поскольку он делает много выводов.

Лучший вариант здесь - посмотреть "v2", который доступен в виде альфа-версии для скачивания. Ваши приписываемые типы должны быть в порядке, но вы также можете указать type-model, как обрабатывать не приписываемые типы; все это делается через RuntimeTypeModel .

Комментарии:

1. спасибо, но АЛЬФА в названии была слишком пугающей, чтобы рассматривать ее подробно.

2. @Killili GlobalOptions может сработать - в противном случае, использование отдельного слоя DTO - ваш лучший вариант, т. Е. повторно сопоставьте данные с тем, что вы контролируете

3. еще один вопрос: не было бы неплохо добавить обратный вызов для неизвестных типов? Таким образом, программист мог бы добавить пользовательскую обработку, например, возвращать список атрибутов ProtoMember для описания порядка и имен?

4. @Killili это не необоснованный вопрос; но этот тип дополнительных метаданных уже является частью того, что вводит версия v2. Добавление этого в v1 потребовало бы больше работы, чем доработка v2.