web-dev-qa-db-ja.com

protobuf-csharp-portとprotobuf-netのどちらを選択するか

最近、もともとGoogleが開発したプロトコルバッファライブラリのC#移植を探す必要がありました。そして、何を推測すると、2人の非常に有名な人物が所有する2つのプロジェクトが見つかりました: protobuf-csharp-portJon Skeet および protobuf-netによって作成)Marc Gravell によって作成されました。私の質問は簡単です。どちらを選択する必要がありますか?

MarcのソリューションはC#の哲学に近いようで(たとえば、既存のクラスのプロパティに属性を追加するだけです)、System.Guidなどの.NET組み込み型をサポートできるようです。

どちらも本当に素晴らしいプロジェクトだと思いますが、あなたの意見は何ですか?

68
PierrOz

ジョンのポイントに同意します。複数の環境でコーディングしている場合、彼のバージョンは他の「コア」実装と同様のAPIを提供します。 protobuf-netは、ほとんどの.NETシリアライザーが実装される方法に非常に似ているため、.NET開発者にとってより身近な(IMO)ものです。そしてジョンが指摘するように-生のバイナリ出力すべきは同じなので、後で必要になったときに別のAPIで再実装できます。

Protobuf-netに関するいくつかのポイントは、この実装に対して特定です。

  • 既存タイプで動作します(.protoから生成されたタイプだけではありません)
  • wCFやmemcachedなどの下で動作します
  • 既存の型にISerializableを実装するために使用できます
  • 継承*とシリアル化のコールバックメソッドをサポート
  • ShouldSerialize[name]などの一般的なパターンをサポート
  • 既存の装飾された型(XmlType/XmlElementまたはDataContract/DataMember)で動作しますたとえば)LINQ-to-SQLモデルがシリアル化して出力することを意味しますすぐに使える(DBMLでシリアル化が有効になっている場合)
  • v2では、属性のないPOCOタイプで機能します
  • v2では、.NET 1.1(これが巨大な販売機能であるかどうかはわかりません)および他のほとんどのフレームワーク(モノタッチを含む-やった!)で動作します。
  • ---(おそらく(まだ実装されていません)v2はフルグラフ*シリアライゼーション(ツリーシリアライゼーションだけでなく)をサポートする可能性があります

(* =これらの機能は100%有効なprotobufバイナリを使用しますが、他の言語から使用するのは難しい場合があります)

57
Marc Gravell

プロジェクトで他の言語も使用していますか?もしそうなら、私のC#ポートは、すべてのプラットフォームで同様のコードを書くことができます。そうでない場合、Marcのポートはおそらく最初からもっと慣用的なC#です。 (私はコードを通常のC#のように「感じる」ようにしようとしましたが、デザインは明らかにJavaで始まるコードに基づいており、故意にJavaも同様です。)

もちろん、これの美しさの1つは、後で気が変わっても、他のプロジェクトを介してすべてのデータが引き続き有効であることを確信できることです。わかってる.

40
Jon Skeet

それによると GitHubプロジェクトサイト protobuf-csharp-portがメインのGoogle Protocol Buffersプロジェクトに折りたたまれているので、 protobuf 3の公式.NET実装になります。ただし、protobuf-netは 2013年に最終更新 でしたが、 GitHubで最近コミットされたもの がありました。

7
Silas

次の理由により、私はprotobuf-csharp-portからprotobuf-netに切り替えました。

  • protobuf-netはより「.netのような」、つまりコード生成ではなくメンバーをシリアル化するための記述子です。
  • Protobuf-csharp-port .protoファイルをコンパイルする場合は、2ステップのプロセスを実行する必要があります。つまり、protocで.protobinにコンパイルしてから、protoGenでコンパイルします。 protobuf-netは、これを1つのステップで実行します。
6
Nick

私の場合、プロトコルバッファを使用して、.netクライアントとj2eeバックエンド間のxmlベースの通信モデルを置き換えたいと思います。私はすでにコード生成を使用しているので、Jonの実装に行きます。

Java interopを必要としないプロジェクトの場合、特にv2では注釈なしで作業できるため、Marcの実装を選択します。

3
juanagui