web-dev-qa-db-ja.com

C#でのProto2とProto3

Proto2バージョンのGoogleProtocolBuffersを使用して別のチームにメッセージを送信する必要があります。 LinuxではJavaとC++を使用しています。WindowsではC#を使用しています。

Jon Skeetのprotobuf-csharp-port( https://github.com/jskeet/protobuf-csharp-port )はproto2をサポートしています。私が正しく理解していれば、Googleはこのコードを取得し、その更新バージョンをメインのprotobufプロジェクトにフォールドしました( https://github.com/google/protobuf/tree/master/csharp )。ただし、C#のproto2はサポートされなくなり、proto3のみがサポートされます。

どのプロジェクトを使うべきかわかりません。新しいチームのサポートが改善されるようです(パフォーマンス、他のチームがアップグレードした場合のproto3のサポート)。しかし、与えられた.protoファイルをproto2からproto3に変換する必要があり、それに伴う問題のリスクがあります。

ほとんどの場合、proto2とproto3のメッセージには互換性があることを読みました。私はProtocolBuffersの経験はありませんが、使用している.protoファイルはかなりバニラに見えます。デフォルト値はなく、ネストされたものもありません。したがって、「required」および「optional」キーワードを削除して新しいライブラリを使用し、これをproto3ファイルとして扱うことができるようです。

あなたの意見では、新しいライブラリを使用するのは面倒な価値がありますか? proto2メッセージとproto3メッセージを互換性のないものにするproto機能のリストはありますか?

8
Michael Covelli

他のチームに必須フィールドがあり、それらのフィールドを指定せずに(またはプリミティブの場合はデフォルト値を明示的に指定して)メッセージを送信した場合、相手チームはメッセージの受信に失敗します-検証されません。

Proto2とproto3の間にはさまざまな違いがあります-いくつかは リリースページ にリストされています:

以下は、言語バージョン3の主な新機能です。

  • プリミティブ値フィールドのフィールドプレゼンスロジックの削除、必須フィールドの削除、およびデフォルト値の削除。これにより、Android Java、Objective C、Goなどの言語のように、オープン構造体表現を使用したproto3の実装が大幅に容易になります。
  • 不明なフィールドの削除。
  • 拡張機能の削除。代わりに、Anyと呼ばれる新しい標準タイプに置き換えられます。
  • 不明な列挙値のセマンティクスを修正しました。
  • マップの追加。
  • 時間、動的データなどを表現するための標準タイプの小さなセットの追加。
  • バイナリプロトエンコーディングの代替としてのJSONでの明確に定義されたエンコーディング。

不明なフィールドの削除は、あなたにとって重大な問題になる可能性があります-他のチームが、コードが認識していないいくつかのフィールドを含むメッセージを送信できることを期待していて、それらのフィールドを維持している彼らにメッセージを返すことができる場合、proto3問題が発生する可能性があります。

Proto3をcan使用できる場合は、proto3バージョンを使用することをお勧めします。これは、proto2バージョンが基本的にメンテナンスモードであるのに対し、適切にサポートされるためです。 2つの間には、主に可変性の点で大きな違いがあります。proto3コードベースで生成されたメッセージクラスは可変であり、すぐに使用できるようになりますが、他の領域で問題が発生する可能性があります。

11
Jon Skeet