用protobuf-net序列化基类属性
本文关键字:属性 基类 序列化 protobuf-net | 更新日期: 2023-09-27 17:50:20
在我们的实体模型中有一个比较复杂的类层次结构。我们有一个用于所有实体的基类BaseEntity
,然后从BaseEntity
派生出一些"2级"类,从任何"2级"类派生出一些"3级"类,以及从任何"3级"类派生出许多"4级"类。这意味着,我们有这样的东西:
- BaseEntity
- DerivedEntity_1
- DerivedEntity_1_1
- DerivedEntity_1_1_1
- DerivedEntity_1_1_2
- DerivedEntity_1_1_3
- DerivedEntity_1_2
- DerivedEntity_1_2_1
- DerivedEntity_1_2_2
- DerivedEntity_1_1
- DerivedEntity_2
- DerivedEntity_2_1
- DerivedEntity_2_1_1
- DerivedEntity_2_2
- DerivedEntity_2_2_1
- DerivedEntity_2_2_2
- DerivedEntity_2_2_3
- DerivedEntity_2_2_4
- DerivedEntity_2_1
- DerivedEntity_1
等等…
现在,当使用protobuf-net通过WCF传输这些类型的实例时,只有"第4级"类的属性被传输-所有来自基类的属性都会丢失!
从其他几个StackOverflow线程(这里,这里和这里),我读到这是默认行为,你有两个选择来解决它:
- 在基类上使用
[ProtoInclude]
属性 - 在运行时使用
TypeModel
和AddSubType()
配置继承
然而,这些选项在我们的场景中都不可行,因为我们有很多派生类。选项1意味着在第1级基类上有数百个属性。选项2将意味着对AddSubType()
的大量调用。
还有其他选择吗?
最后,它需要理解应该如何存储数据,以便您可以取回数据。它不能只是猜测……唯一可靠的方法就是在某处定义模型。但是,这并不一定是原始代码:例如,它可以存储在运行时包含并处理(通过AddSubType)的外部文件中。