#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
andIB
. Почему это не поддерживается? Когда вы сериализуете или десериализуете, вы знаете, следует ли смотреть на таблицу типов для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. Хотя это звучит тривиально.