【问题标题】:how to serialize a class implements two interfaces who have same based interface如何序列化一个类实现两个具有相同基础接口的接口
【发布时间】:2011-11-30 04:41:11
【问题描述】:

我正在尝试使用 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{...}

会返回错误:一个类型只能参与一个继承层次。

【问题讨论】:

    标签: c# serialization protobuf-net


    【解决方案1】:

    接口与 继承实际上并不是同一种“派生”(继承)。虽然提供了 basic 接口支持,但这不是 protobuf-net 当前支持的场景。

    至于它是否可以支持它 - 这需要一些思考。我建议logging a request, here

    【讨论】:

    • @enzhou.liu 重复...“这不是protobuf-net目前支持的场景。至于它是否可以支持 - 这需要一些想法。”。没有简单的机制可以做到这一点。这本质上是钻石问题。
    • @MarcGravell 是从 2 个不同接口继承的类型仍然不受支持吗?还是有什么突破?
    • 我对@9​​87654322@ 和IAIB 类型的两个属性有类似的问题。为什么不支持这个?当您序列化或反序列化时,您知道是根据属性的类型查看IA 还是IB 的类型表。另外,我使用了model.Add(typeof(IA), true).AddSubType(101, typeof(C));model.Add(typeof(IB), true).AddSubType(101, typeof(C));,所以我想知道属性类型是否重要,因为无论哪种方式存储的数字代码都是相同的......然后我不知道详细信息protobuf-net 的设计。
    • @Qwertie 回答“为什么不支持这个?”始终是两个选项之一; a) “还没有人花时间充分考虑其后果、设计、实施和测试”,或 b) “有人已经花时间这样做,并且已经发现它本质上是有问题的”;在不强调我的记忆力的情况下,我不能告诉你它是哪一个,但这不是一个微不足道的场景
    • 尽管听起来微不足道。
    猜你喜欢
    • 2020-12-09
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多