【问题标题】:How to choose between protobuf-csharp-port and protobuf-net如何在 protobuf-csharp-port 和 protobuf-net 之间进行选择
【发布时间】:2011-02-01 02:48:45
【问题描述】:

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

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

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

【问题讨论】:

  • 当然是 Protobuf-csharp-port。乔恩获得了更多的声誉! ^_^
  • 巨人之战!
  • 性能怎么样? (因为这是protobuf的重点)有没有比另一个快?

标签: c# protobuf-net


【解决方案1】:

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

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

【讨论】:

  • 不,我们的项目是完整的 C#,我注意到您的项目确实更“跨语言”...
  • @PierrOz:在这种情况下,您可能希望使用 Marc 的。特别是如果您不需要 .proto 定义其他任何东西,Marc 的解决方案会更简单。
  • @JonSkeet protobuf-csharp-port 是否支持 winrt(win8.1 和 wp8.1)?只是在这里遇到一些问题stackoverflow.com/questions/24670524/…
  • @JonSkeet 我在跨平台代码通过 ZeroMQ 相互“交谈”时遇到了一些困难。我使用 protoc 来生成 Java 和 C++ 类,并且我的 Java 和 C++ 代码互相聊天很棒!我已经使用 Protogen 生成了我的 C# 类,并且我正在尝试让 C++ 与 C# 对话,这不起作用:question asked here 你能快点看一下吗?非常感谢您在这里的时间,非常感谢...
  • @Jadoon:是的,不存在可移植性问题。
【解决方案2】:

我同意乔恩的观点;如果您在多个环境中进行编码,那么他的版本为您提供了与其他“核心”实现类似的 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 二进制文件,但可能很难从其他语言中使用)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在我的例子中,我想使用协议缓冲区来替换 .net 客户端和 j2ee 后端之间基于 xml 的通信模型。因为我已经在使用代码生成了,所以我会选择 Jon 的实现。

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

      【讨论】:

        【解决方案5】:

        根据它的GitHub project siteprotobuf-csharp-port 现在已被合并到主要的 Google Protocol Buffers 项目中,因此它将是 protobuf 3 的官方 .NET 实现。然而,protobuf-net是last updated in 2013,虽然有some commits recently in GitHub

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多