gpt4 book ai didi

protobuf-net - 为什么我必须使用[ProtoInclude]?

转载 作者:行者123 更新时间:2023-12-04 20:24:04 27 4
gpt4 key购买 nike

我已经阅读了有关protobuf-net中继承功能的许多问题。
我只是想知道是否可以像使用[ProtoContract],[ProtoMember]一样使用[DataContract],[DataMember]。为什么我不能使用[KnowType]而不是[ProtoInclude]?

我提出这个问题是因为我已经将[DataContract],[DataMember]用于protobuf-net的序列化。无需添加“Protobuf-net”。它仅使用“System.Runtime.Serialization”。

但是...现在,如果我的类(class)需要从某个类(class)继承,是否需要为[ProtoInclude]属性添加“Protobuf-net”?例如,

using System.Runtime.Serialization;
namespace test
{

[DataContract]
/// [KnowType(typeof(SomeClass))]
/// or
/// [ProtoInclude(100,typeof(SomeClass))]
public class BaseClass
{
//...
[DataMember(Order=1)]
public string BlahBlahBlah {get; set;}
}

[DataContract]
public class ChildClass1 : BaseClass
{
//...
[DataMember(Order=1)]
public string BlahBlahBlah {get; set;}
}
}// end namespace

,最后,我想知道我是否有100个子类,是否会在基类内部添加100个[ProtoInclude]标签使自己发疯?

在adv中寻求帮助

最佳答案

编辑:在v2中不再需要-您可以在运行时指定它,或使用DynamicType

这样做的原因是protobuf Wire格式(由Google设计)不包含任何类型的元数据,因此我们需要某种方式来了解我们正在谈论的对象类型。 [KnownType]不提供此信息,也没有明确的方法来独立提供可靠的 key 。

实际上,protobuf也不支持继承-protobuf-net通过将子类型视为嵌套消息来解决这一问题。因此,ChildClass1实际上在传输过程中出现,就好像BlahBlahBlah是子对象的属性一样,有点像:

message BaseClass {
optional ChildClass1 ChildClass1 = 1;
optional SomeOtherSubType SomeOtherSubType = 2;
}
message ChildClass1 {
optional string BlahBlahBlah = 1;
}

等等

重新省略它;在“v2”中,您可以选择通过自己的代码在类型模型之外指定此数据。这意味着您无需装饰所有内容,但仍需要某种机制来将键与类型相关联。

关于protobuf-net - 为什么我必须使用[ProtoInclude]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3100207/

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