当前位置 : 主页 > 大数据 > 区块链 >

ProtoBuf-Net ProtoInclude通用类型子类

来源:互联网 收集:自由互联 发布时间:2021-06-22
我在ProtoBuf-Net中遇到了一些问题,它有一个继承自泛型类的对象的子类. 我的继承树看起来像这样: Node SomeNodeType SomeOtherType ResourceNodeT ShipResource : ResourceNodeShip SomeResource : ResourceNodeSomeT
我在ProtoBuf-Net中遇到了一些问题,它有一个继承自泛型类的对象的子类.

我的继承树看起来像这样:

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 { }

我添加了一个“待办事项”项目并且未通过测试.然而,有趣的是,在设置它的时候,我还发现了一些不愉快的事情,所以我需要先解决这个问题.

网友评论