как сериализовать класс реализует два интерфейса, которые имеют одинаковый интерфейс на основе

#c# #serialization #protobuf-net

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

Вопрос:

Я пытаюсь использовать protobuf v2 для сериализации класса, который реализует интерфейсы B и C. И оба B и C являются производными от D.


 [ProtoBuf.ProtoContract]
[ProtoBuf.Includes(101, typeof(B))
[ProtoBuf.Includes(101, typeof(C))
interface D{...}
  

 [ProtoBuf.ProtoContract]
[ProtoBuf.Includes(101, typeof(A))
interface B:interfae D{...}
  

 [ProtoBuf.ProtoContract]
[ProtoBuf.Includes(101, typeof(A))
interface C:interface D
{
   ...
}
  

 [ProtoBuf.ProtoContract]
class A: interface B, interface C{...}
  

Будет возвращена ошибка: тип может участвовать только в одной иерархии наследования.

Ответ №1:

Интерфейсы на самом деле не являются «производными» (наследованием) того же типа, что и наследование классов. Хотя базовая поддержка интерфейса предоставляется, это не тот сценарий, который в настоящее время поддерживает protobuf-net.

Что касается того, может ли он его поддерживать — об этом нужно подумать. Я бы предложил зарегистрировать запрос здесь.

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

1. @enzhou. лю повторить … » это не тот сценарий, который в настоящее время поддерживает protobuf-net. Что касается того, может ли он его поддерживать — об этом нужно подумать.». Не приходит в голову простой механизм для этого; по сути, это проблема с бриллиантами.

2. @MarcGravell типы, которые наследуются от 2 разных интерфейсов, все еще не поддерживаются? или был какой-то прорыв?

3. У меня аналогичная проблема с a class C : IA, IB и двумя свойствами типа IA and IB . Почему это не поддерживается? Когда вы сериализуете или десериализуете, вы знаете, следует ли смотреть на таблицу типов для IA или IB на основе типа свойства. Кроме того, я использовал model.Add(typeof(IA), true).AddSubType(101, typeof(C)); и model.Add(typeof(IB), true).AddSubType(101, typeof(C)); поэтому мне интересно, имеет ли значение, какой тип свойства, учитывая, что сохраненный числовой код будет одинаковым в любом случае … опять же, я не знаю тонких деталей дизайна protobuf-net.

4. @Qwertie Ответ на вопрос «Почему это не поддерживается?» всегда один из двух вариантов; а) «никто еще не нашел времени, чтобы полностью рассмотреть последствия этого, спроектировать его, реализовать и протестировать», или б) «кто- то нашел время, чтобы сделать это, и обнаружил, что это по своей сути проблематично»; Я могуне могу сказать вам, какой из них это, не напрягая мою память, но это не тривиальный сценарий

5. Хотя это звучит тривиально.