当子类不在同一个程序集中时如何在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;
但就我而言,我无法引用包含 Derived
和 Derived2
类的项目(这会导致循环引用,更重要的是,父级必须知道其所有子级,这很奇怪)。
使用默认的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中列出继承的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序不在前台时,如何在 Windows Universal 中获得正确的时间间隔?