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

Я пытаюсь использовать protobuf v2 для сериализации класса A, реализующего интерфейсы 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{...}

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


person enzhou.liu    schedule 03.10.2011    source источник


Ответы (1)


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

Что касается того, может ли поддерживать его, то это потребует некоторых размышлений. Я бы предложил записать запрос здесь< /а>.

person Marc Gravell    schedule 03.10.2011
comment
@ enzhou.liu, чтобы повторить ... это не тот сценарий, который в настоящее время поддерживает protobuf-net. Что касается того, сможет ли он поддерживать это - это потребует некоторых размышлений. На ум не приходит никакого простого механизма для этого; по сути, это проблема алмаза. - person Marc Gravell; 04.10.2011
comment
@MarcGravell - это типы, которые наследуются от двух разных интерфейсов, которые все еще не поддерживаются? или был какой-то прорыв? - person i3arnon; 11.05.2015
comment
У меня аналогичная проблема с class C : IA, IB и двумя свойствами типа IA и IB. Почему это не поддерживается? Когда вы сериализуете или десериализуете, вы знаете, следует ли смотреть в таблице типов для IA или IB в зависимости от типа свойства. Кроме того, я использовал model.Add(typeof(IA), true).AddSubType(101, typeof(C)); и model.Add(typeof(IB), true).AddSubType(101, typeof(C));, поэтому мне интересно, имеет ли значение тип свойства, учитывая, что сохраненный числовой код будет одинаковым в любом случае... опять же, я не знаю мелких деталей дизайна protobuf-net . - person Qwertie; 25.10.2019
comment
@Qwertie Ответ на вопрос, почему это не поддерживается? всегда является одним из двух вариантов; а) никто еще не нашел времени, чтобы полностью рассмотреть последствия этого, спроектировать, внедрить и протестировать его, или б) кто-то потратил время, чтобы сделать это, и обнаружил, что это проблематична по своей сути; Я не могу сказать вам, какой из них, не напрягая свою память, но это не тривиальный сценарий. - person Marc Gravell; 25.10.2019
comment
Хоть это и банально звучит. - person Qwertie; 25.10.2019