protobuf-net デシリアライゼーションにおける不明な回線タイプ例外のトラブルシューティング
protobuf-net で、逆シリアル化プロセス中に ProtoException が発生し、メッセージは「unknown Wire-type 6」で、入力データに予期しないフィールド タイプがあることを示します。この問題を解決するには、線種の概念を理解し、根本的な原因を特定する必要があります。
線種を理解する
行タイプはフィールド ヘッダー内の 3 ビットのフラグで、後続のデータ形式を指定します。これは、ストリーム内の予期しないデータを処理するために重要です。各行タイプの値は、特定のデータタイプに対応します:
- 0: 可変長整数 (base-128 エンコード)
- 1: 64 ビット整数または倍精度浮動小数点数
- 2: 長さの接頭辞 (文字列、バイト配列、パック配列、サブオブジェクト)
- 3: 開始グループ (非推奨)
- 4: 終了グループ (非推奨)
- 5: 32 ビット整数または単精度浮動小数点数
デバッグの問題
不明な線種例外の原因となっている問題フィールドを特定するには:
-
入力データの検証: 入力データが別の形式 (JSON、XML など) ではなく、実際の protobuf データであることを確認します。
-
ファイルの切り詰めを確認します: ファイルにシリアル化する場合は、書き込む前にファイルが切り詰められていないことを確認します。切り詰められていないファイルには残留データが含まれている可能性があり、protobuf ストリームが破損します。
-
オブジェクトの互換性を確認します: 逆シリアル化されたオブジェクトの型がシリアル化に使用される型と一致することを再確認します。不正な型に逆シリアル化すると、この例外が発生する可能性があります。
その他のヒント
- WireShark などのツールを使用してバイナリ ストリームを検査し、問題のあるフィールドのワイヤ タイプを特定します。
- ProtoSyntaxDefault オプションを protobuf 3 に設定します。これにより、より厳密な線形式が使用され、不明な線種の問題が防止されます。
- 逆シリアル化中に不明なワイヤー タイプにフラグを立てるために、ThrowProtoExceptionOnUnknownWireTypes オプションを有効にすることを検討してください。
以上がprotobuf-net のシリアル化解除中に「不明なワイヤ タイプ 6」例外が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。