当子类不在同一个程序集中时如何在protobuf中列出继承

Posted

技术标签:

【中文标题】当子类不在同一个程序集中时如何在protobuf中列出继承【英文标题】:How to list inheritance in protobuf when child classes are not in same assembly 【发布时间】:2017-07-17 09:27:44 【问题描述】:

在我们的应用程序中,我们将模型(通过 protobuf 通过 WCF 传输)放在不同的包中,“公共”项目几乎被所有子项目引用。在孩子的项目中,我们找到了某些特定业务领域的所有课程细节。

所有的 DLL 都没有发货,这取决于客户购买的功能。

我知道指定可能的子类的一种方法是:

[ProtoContract]
[ProtoInclude(100, typeof(Derived))]
[ProtoInclude(101, typeof(Derive2))]
public class Base  
    [ProtoMember(Order=1)]
    int Old; 

但就我而言,我无法引用包含 DerivedDerived2 类的项目(这会导致循环引用,更重要的是,父级必须知道其所有子级,这很奇怪)。

使用默认的DataContractSerializer 可以指定一种方法来查找我们正在使用的类类型,有没有办法实现这一点?还是我不能在约束条件下使用 protobuf?

【问题讨论】:

【参考方案1】:

奇怪的是,父母必须知道它的所有孩子。

不,这其实很正常;另请参阅 [XmlInclude][KnownType],它们的工作方式相同

但是,为避免typeof 的循环引用问题,您可以将程序集限定名 用作字符串。要获取程序集限定名称,请查看typeof(Foo).AssemblyQualifiedName 写的内容,然后:

[ProtoInclude(100, "your assembly qualified name here")]
[ProtoInclude(101, "another assembly qualified name here")]

另一种选择是在运行时每次都使用RuntimeTypeModel.Default[typeof(RootType)].AddSubType(...) 进行配置 - 但是:您仍然需要能够使用可靠的整数可靠地配置它。

【讨论】:

好吧,我仍然认为面向对象的方法是相反的,您可以在运行时使用 DataContractResolver 而不是 KnownType。关于整数,有一个子问题:它们在 SubTypes 和 ProtoMembers 上应该是唯一的吗?此外,在父类及其子类之间,这些数字应该是唯一的还是有某种机制来确保子类的 ID 与父类的 ID 偏移? @J4N 不,它们(成员 + 包含)只需要在单个父级中是唯一的

以上是关于当子类不在同一个程序集中时如何在protobuf中列出继承的主要内容,如果未能解决你的问题,请参考以下文章

限制 protobuf-net 继承“树”

在另一个程序集中创建 WebPart 子类时出错

当应用程序不在前台时,如何在 Windows Universal 中获得正确的时间间隔?

对不在训练集中的新词使用 keras 分词器

ProtoBuf-Net ProtoInclude 泛型类型子类

NHibernate 在单独的程序集中加入了子类