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


70

最近,我不得不寻找最初由Google开发的Protocol Buffers库的C#移植。猜猜是什么,我在这里发现了两个项目,它们都是由两个非常有名的人拥有的:由Jon Skeet编写的protobuf-csharp-port和由Marc Gravell编写的protobuf-net。我的问题很简单:我必须选择哪一个?

我非常喜欢Marc的解决方案,因为在我看来它更接近C#哲学(例如,您可以仅将属性添加到现有类的属性中),并且看起来它可以支持.NET内置类型,例如System.Guid。

我敢肯定他们两个都是很棒的项目,但是您的意见是什么?


3
当然是Protobuf-csharp-port。乔恩获得了更多的声誉!^ _ ^
Arnis Lapsa,2010年

1
巨人之战!
Farax

1
性能如何?(因为这是protobuf的重点)是否有一个比另一个快?
tigrou

Answers:


63

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

protobuf-net的一些特定于此实现的点:

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

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


45

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

当然,这样做的好处之一是您可以稍后改变主意,并确信所有数据通过另一个项目仍然有效-就我而言,它们应该是绝对二进制兼容的(就序列化数据而言)知道。


不,我们的项目没有完整的C#代码,我注意到您的项目确实更像是“跨语言” ...
PierrOz 2010年

3
@PierrOz:在这种情况下,您可能要使用Marc。特别是,如果您不需要其他任何.proto定义,则Marc的解决方案会更容易。
乔恩·斯基特

@JonSkeet protobuf-csharp-port是否支持winrt(win8.1和wp8.1)?只是遇到一些问题在这里stackoverflow.com/questions/24670524/...
IloveIniesta

@JonSkeet我在通过ZeroMQ进行跨平台代码“对话”时遇到一些困难。我使用protoc生成Java和C ++类,并且我的Java和C ++代码彼此聊天!我已经使用Protogen生成了C#类,并且试图使C ++与C#进行通信,但这种方法无法正常工作:这里的问题是您乐于快速浏览吗?非常感谢您在这里的时间,非常感谢...
MoonKnight

2
@Jadoon:是的,那里没有可移植性问题。
乔恩·斯基特


7

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

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

3

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

对于不需要Java互操作的项目,我会选择Marc的实现,尤其是因为v2允许不使用注释就可以工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.