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

时间:2010-03-26 10:09:33

标签: c# protobuf-net

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

我非常喜欢Marc的解决方案,因为在我看来,我更接近C#philisophy(例如,你可以只为现有类的属性添加属性),看起来它可以支持.NET内置类型,如System。 GUID。

我相信他们两个都是很棒的项目,但你的意见是什么?

5 个答案:

答案 0 :(得分:57)

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

对于此实现具体的一些重点是protobuf-net:

  • 使用现有类型(不仅仅是.proto生成的类型)
  • 适用于WCF和memcached
  • 之类的东西
  • 可用于为现有类型实施ISerializable
  • 支持继承*和序列化回调方法
  • 支持常见模式,例如ShouldSerialize[name]
  • 适用于现有的修饰类型(XmlType / XmlElementDataContract / DataMember) - 意味着(例如)LINQ-to-SQL模型序列化了-the-box(只要在DBML中启用序列化)
  • 在v2中,适用于没有任何属性的POCO类型
  • 在v2中,适用于.NET 1.1(不确定这是一个巨大的销售功能)和大多数其他框架(包括monotouch - yay!)
  • 可能(尚未实现)v2可能支持全图*序列化(不仅仅是树序列化)

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

答案 1 :(得分:40)

您是否也在项目中使用其他语言?如果是这样,我的C#端口将允许您在所有平台上编写类似的代码。如果没有,Marc的端口可能更加惯用C#开头。 (我试图使我的代码“感觉”像普通的C#一样,但设计显然是基于Java代码开始的,故意使得熟悉那些使用Java的人。)

当然,其中一个优点是您可以稍后改变主意,并确信所有数据仍然可以通过其他项目有效 - 它们应该是绝对二进制兼容的(就序列化数据而言),如据我所知。

答案 2 :(得分:7)

根据它的GitHub project site protobuf-csharp-port 现已被纳入主要的Google Protocol Buffers项目,因此它将成为protobuf的官方.NET实现3.然而,protobuf-net是last updated in 2013,尽管有some commits recently in GitHub

答案 3 :(得分:6)

我刚从protobuf-csharp-port切换到protobuf-net因为:

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

答案 4 :(得分:3)

在我的情况下,我想使用协议缓冲区来替换.net客户端和j2ee后端之间基于xml的通信模型。由于我已经在使用代码生成,因此我将使用Jon的实现。

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