72

私は最近、もともと Google が開発した Protocol Buffers ライブラリの C# 移植を探す必要がありました。なんと、ここで 2 つの非常に有名な人物が所有する 2 つのプロジェクトを見つけました。Jon Skeetが作成したprotobuf-csharp-portと、 Marc Gravellが作成したprotobuf-netです。私の質問は簡単です。どちらを選択する必要がありますか?

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

どちらも本当に素晴らしいプロジェクトだと思いますが、どう思いますか?

4

5 に答える 5

67

私はジョンの主張に同意します。複数の環境でコーディングしている場合、彼のバージョンは他の「コア」実装と同様のAPIを提供します。protobuf-netは、ほとんどの.NETシリアライザーの実装方法に非常に似ているため、.NET開発者にはより馴染みがあります(IMO)。Jonが指摘しているように、後で必要になった場合に別の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バイナリを使用しますが、他の言語からは利用するのが難しい場合があります)

于 2010-03-26T11:18:22.853 に答える
9

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

于 2015-07-23T10:41:02.077 に答える
7

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

  • protobuf-net は「.net ライク」です。つまり、コード生成の代わりにメンバーをシリアル化する記述子です。
  • protobuf-csharp-port .proto ファイルをコンパイルする場合は、2 段階のプロセスを実行する必要があります。つまり、protoc を使用して .protobin にコンパイルし、protoGen を使用してコンパイルします。protobuf-net はこれを 1 ステップで行います。
于 2010-06-16T12:43:19.420 に答える
3

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

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

于 2011-10-18T18:06:49.627 に答える