protobufには、ワイヤ上のタイプ情報は含まれていません(protobufの外部で自分で行う場合を除く)。そのため、それを厳密に検証することはできません。これは、タイプが交換可能で互換性があることを意味するため、実際には良いことです。他のタイプとclass abc
互換性のある契約がある限り、それは機能します。ここで「互換性がある」とは、両方に共通するフィールド番号に対して、互換性のあるワイヤタイプを持っていることを意味します。abc
フィールド4を文字列として宣言し、他のクラスがフィールド4を倍精度数として宣言した場合、逆シリアル化で失敗します。
使用できるもう1つの「シグナル」は、required
フィールドの省略です。abc
常にフィールド3が含まれているが、フィールド3を省略したデータを取得する場合、それはおそらくではありませんabc
。ただし、protobufはバージョントレラントになるように設計されていることに注意してください。データが新しいバージョンのコントラクトを使用しているか、拡張フィールドを使用している可能性があるため、追加のフィールドがそうでないことを意味するとは限りません。abc
同様に、オプションフィールドが欠落しているのは、単に値を提供しないことを選択したか、使用しているコントラクトのバージョンでそのフィールドが宣言されていないためです。
解析が成功するかどうかを再テストします。これは実装固有です。c ++の実装には、チェックする戻り値か、チェックするフラグフィールドのいずれかがあると思います。私はそのAPIを自分で使用しないので、言うことはできません。他のいくつかのプラットフォームでは、重大な問題が発生した場合に例外がスローされると予想します(java、.netなど)。