如何在protobuf-csharp-port和protobuf-net之间进行select

我最近不得不寻找C#移植最初由Google开发的Protocol Buffers库。 猜猜看,我发现两个项目都是由两位知名人士所拥有的:由Jon Skeet和protobuf-net编写的protobuf-csharp-port ,由Marc Gravell编写。 我的问题很简单:我必须select哪一个?

我很喜欢Marc的解决scheme,因为在我看来,更接近于C#philisophy(例如,你可以添加属性到现有的类的属性),它看起来像它可以支持.NET的内置types,如System.Guid。

我相信他们都是非常棒的项目,但是你有什么想法?

我同意乔恩的观点。 如果您在多个环境中进行编码,那么他的版本会为您提供与其他“核心”实现类似的API。 protobuf-net与大多数.NET序列化器的实现方式相似,因此对.NET开发人员更为熟悉(IMO)。 正如Jon所说 – 原始的二进制输出应该是相同的,所以如果你以后需要的话,你可以重新实现一个不同的API。

有一些重要的protobuf网是特定于此实现:

  • 现有types(不只是从.proto生成的types)
  • 在WCF和memcached之类的东西下工作
  • 可以用来为现有types实现ISerializable
  • 支持inheritance*和序列化callback方法
  • 支持常见的模式,如ShouldSerialize[name]
  • 与现有的装饰types( XmlType / XmlElementDataContract / DataMember )一起工作 – 意味着(例如)LINQ-to-SQL模型XmlType串行化(只要在DBML中启用序列化)
  • 在v2中,适用于没有任何属性的POCOtypes
  • 在V2中,工作在.NET 1.1(不知道这是一个巨大的销售function)和大多数其他框架(包括monotouch – 耶!)
  • 可能 (尚未实现)v2可能支持全图*序列化(不仅仅是树序列化)

(* =这些function使用100%有效的protobuf二进制文件,但可能很难从其他语言使用)

你也在项目中使用其他语言吗? 如果是这样,我的C#端口将让你在所有平台上编写类似的代码。 如果没有,Marc的端口可能更习惯C#开始。 (我试图让我的代码像普通的C#一样“感觉”,但是devise显然是基于Java代码开始的,故意这样使得它对使用Java的人也很熟悉。

当然,其中一个好处就是你可以稍后改变主意,并确信你的所有数据在其他项目中仍然有效 – 它们应该完全是二进制兼容的(就序列化数据而言),就我而言知道了。

根据它的GitHub项目网站 protobuf-csharp-port 现在已经被折叠到主要的Google协议缓冲区项目中 ,所以它将是protobuf 3的官方.NET实现。然而,protobuf-net是在2013年最后更新的 ,尽pipe已经有最近在GitHub上有一些提交 。

我只是从protobuf-csharp-port切换到protobuf-net,因为:

  • protobuf-net更像“.net like”,即描述符来串行化成员而不是代码生成。
  • 如果要编译protobuf-csharp-port .proto文件,则必须执行两个步骤,即使用protoc编译为.protobin,然后使用protoGen编译。 protobuf网一步完成此操作。

在我的情况下,我想使用协议缓冲区来replace.net客户端和j2ee后端之间的基于xml的通信模型。 因为我已经在使用代码生成function,所以我会去Jon的实现。

对于不需要java interop的项目,我会selectMarc的实现,特别是因为v2允许在没有注释的情况下工作。