gpt4 book ai didi

ProtoBuf-Net ProtoInclude 泛型类型子类

转载 作者:行者123 更新时间:2023-12-04 16:21:17 37 4
gpt4 key购买 nike

我在使用从泛型类继承的对象的子类时遇到了 ProtoBuf-Net 的一些问题。

我的继承树如下所示:

Node
SomeNodeType
SomeOtherType
ResourceNode<T>
ShipResource : ResourceNode<Ship>
SomeResource : ResourceNode<SomeType>

对于所有普通类型,我一直在基本 Node 类型上使用 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 { }

我添加了一个“待办事项”项目并为此测试失败。然而,有趣的是,在设置它的同时,我还发现了一个播放不愉快的场景,所以我需要先解决这个问题

关于ProtoBuf-Net ProtoInclude 泛型类型子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9408133/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com