我在使用从泛型类继承的对象的子类的 ProtoBuf-Net 时遇到了一些问题。
我的继承树看起来像这样:
Node
SomeNodeType
SomeOtherType
ResourceNode<T>
ShipResource : ResourceNode<Ship>
SomeResource : ResourceNode<SomeType>
Run Code Online (Sandbox Code Playgroud)
我一直在所有普通类型的基本 Node 类型上使用 ProtoInclude。
使用 protobuf-net 实现这种层次结构的最佳方法是什么?我试过只包含所有内容,但我得到的错误似乎源于 protobuf 试图将对象反序列化为它的父对象之一。
您可能会看到:
一种类型只能参与一个继承层次结构
此刻,对吧?
ResourceNode<T>
当您回想起不是封闭类型 - 而是ResourceNode<Ship>
和ResourceNode<SomeType>
时,问题就会变得更加清晰。这意味着两件事:
首先,Node
需要分别了解两个 (ResourceNode<Ship>
和ResourceNode<SomeType>
),其次:我们需要ResourceNode<Ship>
讲述ShipResource
only和ResourceNode<SomeType>
about SomeResource
only。
第一个对于属性方法来说很简单:
[ProtoContract]
[ProtoInclude(1, typeof(SomeNodeType)), ProtoInclude(2, typeof(SomeOtherType))]
[ProtoInclude(3, typeof(ResourceNode<Ship>))]
[ProtoInclude(4, typeof(ResourceNode<SomeType>))]
public class Node { }
Run Code Online (Sandbox Code Playgroud)
然而,第二位无法在任何当前版本中清晰地表达。我们目前无法使用:
[ProtoContract]
[ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))]
public class ResourceNode<T> : Node { }
Run Code Online (Sandbox Code Playgroud)
因为这些属性适用于和 ,并且代表非法继承链。上面的重复是故意的,因为它们不冲突,同样因为它们是并行分支。ResourceNode<Ship>
ResourceNode<SomeType>
1
在 v2 中,我们可以做的是显式配置这种关系:
RuntimeTypeModel.Default.Add(typeof(ResourceNode<Ship>), true)
.AddSubType(1, typeof (ShipResource));
RuntimeTypeModel.Default.Add(typeof(ResourceNode<SomeType>), true)
.AddSubType(1, typeof(SomeResource));
Run Code Online (Sandbox Code Playgroud)
我想要做的是调整解析器,使其能够将其检测为常见情况,以便您可以简单地使用以下属性:
[ProtoContract]
[ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))]
public class ResourceNode<T> : Node { }
Run Code Online (Sandbox Code Playgroud)
我添加了一个“待办事项”项目,但测试失败。然而,有趣的是,在设置时我还发现了一个场景,有些东西玩得不愉快,所以我需要先解决这个问题
归档时间: |
|
查看次数: |
4530 次 |
最近记录: |