最近、もともとGoogleが開発したプロトコルバッファライブラリのC#移植を探す必要がありました。そして、何を推測すると、2人の非常に有名な人物が所有する2つのプロジェクトが見つかりました: protobuf-csharp-port 、 Jon Skeet および protobuf-netによって作成) 、 Marc Gravell によって作成されました。私の質問は簡単です。どちらを選択する必要がありますか?
MarcのソリューションはC#の哲学に近いようで(たとえば、既存のクラスのプロパティに属性を追加するだけです)、System.Guidなどの.NET組み込み型をサポートできるようです。
どちらも本当に素晴らしいプロジェクトだと思いますが、あなたの意見は何ですか?
ジョンのポイントに同意します。複数の環境でコーディングしている場合、彼のバージョンは他の「コア」実装と同様のAPIを提供します。 protobuf-netは、ほとんどの.NETシリアライザーが実装される方法に非常に似ているため、.NET開発者にとってより身近な(IMO)ものです。そしてジョンが指摘するように-生のバイナリ出力すべきは同じなので、後で必要になったときに別のAPIで再実装できます。
Protobuf-netに関するいくつかのポイントは、この実装に対して特定です。
ISerializable
を実装するために使用できますShouldSerialize[name]
などの一般的なパターンをサポートXmlType
/XmlElement
またはDataContract
/DataMember
)で動作しますたとえば)LINQ-to-SQLモデルがシリアル化して出力することを意味しますすぐに使える(DBMLでシリアル化が有効になっている場合)(* =これらの機能は100%有効なprotobufバイナリを使用しますが、他の言語から使用するのは難しい場合があります)
プロジェクトで他の言語も使用していますか?もしそうなら、私のC#ポートは、すべてのプラットフォームで同様のコードを書くことができます。そうでない場合、Marcのポートはおそらく最初からもっと慣用的なC#です。 (私はコードを通常のC#のように「感じる」ようにしようとしましたが、デザインは明らかにJavaで始まるコードに基づいており、故意にJavaも同様です。)
もちろん、これの美しさの1つは、後で気が変わっても、他のプロジェクトを介してすべてのデータが引き続き有効であることを確信できることです。わかってる.
それによると GitHubプロジェクトサイト protobuf-csharp-portがメインのGoogle Protocol Buffersプロジェクトに折りたたまれているので、 protobuf 3の公式.NET実装になります。ただし、protobuf-netは 2013年に最終更新 でしたが、 GitHubで最近コミットされたもの がありました。
次の理由により、私はprotobuf-csharp-portからprotobuf-netに切り替えました。
私の場合、プロトコルバッファを使用して、.netクライアントとj2eeバックエンド間のxmlベースの通信モデルを置き換えたいと思います。私はすでにコード生成を使用しているので、Jonの実装に行きます。
Java interopを必要としないプロジェクトの場合、特にv2では注釈なしで作業できるため、Marcの実装を選択します。