【问题标题】:Why I have to use [ProtoInclude]?为什么我必须使用 [ProtoInclude]?
【发布时间】:2010-06-23 08:51:42
【问题描述】:

我已经阅读了很多关于 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

【问题讨论】:

  • 请注意,这在 v2 中不再适用
  • @Marc;谢谢更新。那我试试v2吧。

标签: protobuf-net


【解决方案1】:

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


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

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

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

等

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

【讨论】:

  • 更少的 SO,更多的 protobuf-net 开发!等不及 v2 了。
  • 非常感谢您提供的信息。我仍然想知道如果我有 27 个子类只实现了 1 个基类,我必须在基类中添加 27 个 [ProtoInclude] 标签。对吗?
  • @vee - 在当前的可下载版本中,是的。在“v2”中,没有:但是 somewhere 您需要给每个子类型一个数字。但不一定要通过属性。
  • @MarcGravell:我开始使用 v2。如何使用自己的代码准确指定属性?我不想在现有课程中使用任何装饰。可能的?另外,我可以在生产中使用 v2 吗?
  • @Sam 我们一直在 SO 的生产环境中使用 v2 ......好吧,年龄和年龄。和年龄。所以:是的。对于不使用属性,请参阅RuntimeTypeModel。这有用于描述每种类型 (MetaType) 和每个成员 (ValueMember) 的 API。如果您有具体示例,请告诉我,我会完整展示。
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多