protobuf-net,它是怎么做的?

时间:2010-07-16 21:18:12

标签: protobuf-net

我们现在使用.net二进制序列化来序列化数据以保持不变。它完成了这项工作,但没有像它打算用于那个目的一样,因为改变数据并不是那么微不足道。

所以我开始研究protobuf,因为它是围绕这个目的设计的。

我正在研究protobuf-net如何使用它。以下是我还不知道的一些事情。如果你已经得到答案,它将节省我的一天。

  • 我不关心.proto文件,因为产品只是在.net中。所以我可以在不使用.proto文件的情况下使用protobuf-net。
  • 如果是,我可以稍后在我的c#类中生成.proto文件,如果需要移植到其他语言

1 个答案:

答案 0 :(得分:4)

是的,protobuf-net不使用.proto文件。实际上,对于protobuf-net来说,核心是在.proto支持之前写的。您所需要的只是允许它为您要序列化的每个成员获取唯一编号。在“v2”(未发布)中,您可以在外部执行此操作,但在可用的dll中,这意味着属性。这个可以是定制的protobuf-net属性,或者你可以使用(例如)DataContractSerializer属性,如果更方便的话:

[DataContract]
public class Foo {
    [DataMember(Order=1)]
    public int Abc {get;set;}

    [DataMember(Order=2)]
    public string Def {get;set;}
}

支持生成.proto文件(Serializer.GetProto) - 但是,有一些警告:

  • protobuf-net支持继承; Google protobuf规范中没有继承定义。如果您认为互操作是一个问题,那么最好避免继承(尽管解释它的方式; probofuf-net总是发出有效的protobuf流)
  • 其他复杂类型可能需要解释;例如,当floatdouble直接映射到protobuf类型(在每个实现中都可用)时,{em> not 是decimalDateTime的真实;如果您认为互操作是一个问题,那么从一开始就可能值得简化 - 例如,决定您要发送DateTime,或者将代表偏移的long发送到一个纪元?在任何实施中都易于理解。