1

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

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

我正在查看 protobuf-net 如何使用它。下面是一些我还不知道的东西。如果您已经得到答案,它将节省我的时间。

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

1 回答 1

4

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

[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 流)
  • 其他复杂类型可能需要解释;例如 whilefloatdouble直接映射到 protobuf 类型(在每个实现中都可用),而and则不是这样;如果您认为互操作是一个问题,则可能值得从一开始就简化这一点 - 例如决定您要发送 a ,也许发送代表偏移量到一个时期的 a ?在任何实现中都易于解释。decimalDateTimeDateTimelong
于 2010-07-17T20:59:05.797 回答