5

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

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

但是......现在如果我的类需要从某个类继承,我是否必须为 [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] 标签会不会让我发疯?

谢谢你的帮助

ve

4

1 回答 1

5

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


这样做的原因是 protobuf 有线格式(由 Google 设计)不包含任何类型的元数据,因此我们需要一些方法来了解我们正在谈论的对象类型。[KnownType]不提供此信息,并且没有明确的方法可以独立提供健壮的密钥。

实际上,protobuf 也不支持继承——protobuf -net 通过将子类型视为嵌套消息来围绕它进行填充。所以 aChildClass1实际上在传输过程中出现,好像BlahBlahBlah是子对象的属性,有点像:

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

ETC

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

于 2010-06-23T14:21:40.483 回答