我在ProtoBuf-Net中遇到了一些问题,它有一个继承自泛型类的对象的子类. 我的继承树看起来像这样: Node SomeNodeType SomeOtherType ResourceNodeT ShipResource : ResourceNodeShip SomeResource : ResourceNodeSomeT
我的继承树看起来像这样:
Node SomeNodeType SomeOtherType ResourceNode<T> ShipResource : ResourceNode<Ship> SomeResource : ResourceNode<SomeType>
我一直在所有普通类型的基本节点类型上使用ProtoInclude.
使用protobuf-net实现这种层次结构的最佳方法是什么?我尝试过包含所有内容,但是我得到的错误似乎源于protobuf尝试将对象反序列化为其中一个父对象.
你可能会看到:A type can only participate in one inheritance hierarchy
此刻,对吧?
当您回想起ResourceNode< T>时,问题会变得更加清晰.不是封闭类型 – 但是ResourceNode< Ship>和ResourceNode< SomeType>是.这意味着两件事:
首先,Node需要分别知道两者(ResourceNode< Ship>和ResourceNode< SomeType>),其次:我们需要告诉ResourceNode< Ship>关于ShipResource,以及ResourceNode< SomeType>关于SomeResource只.
第一个很容易使用属性方法:
[ProtoContract] [ProtoInclude(1, typeof(SomeNodeType)), ProtoInclude(2, typeof(SomeOtherType))] [ProtoInclude(3, typeof(ResourceNode<Ship>))] [ProtoInclude(4, typeof(ResourceNode<SomeType>))] public class Node { }
但是,第二位不能在任何当前版本中干净地表达.我们目前无法使用:
[ProtoContract] [ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))] public class ResourceNode<T> : Node { }
因为这些属性同时适用于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));
我想要做的是调整解析器,使其能够将此检测为常见情况,以便您可以简单地使用以下属性:
[ProtoContract] [ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))] public class ResourceNode<T> : Node { }
我添加了一个“待办事项”项目并且未通过测试.然而,有趣的是,在设置它的时候,我还发现了一些不愉快的事情,所以我需要先解决这个问题.