2016-05-24 7 views
0

C#の3.0.0-beta3バージョンのネイティブパッケージを使用すると、official documentationのデフォルトが解析段階で割り当てられ、値が一切渡されなかったかどうかを区別することはできません。デコードされたプロトタイプエンティティに対して何らかのバリデーションを行いたいと思って以来、重要なポイントです。誰かがデータのカスタム検証やパッシングステージのオーバーライド/インターセプトの経験があるかどうか疑問に思っています。構文解析段階での検証とオーバーライド

いくつかの基本的な例:私は強制したかったint32のフィールドについては

  1. それがすべてで合格していなかった場合にはその代わりに、デフォルトの0私はこのケースを処理し、int32のフィールド用のカスタム例外
  2. を上げたいです私は、構文解析/デコードステージ上の最小長を強制したい100-1000のような許容値の範囲は、それ以外の文字列フィールドの例外
  3. を解析投げる

どうでしょうあなたsugges protobufパッケージ/ APIの上にカスタムバリデーションレイヤーを書くこと以外は何もしないでください。私はまだ拡張性の点があるが、まだ見つからないことを願っています

答えて

1

検証はアプリケーションコードのポストパースで行う必要があります。パーサー自体でこれを行うためのフックはありません。

Proto3では、デフォルト値のフィールドと未送信のフィールドを区別しません。実際、送信側では、フィールドが明示的にデフォルト値に設定されている場合、フィールドはエンコードされません。したがって、proto3で最初のルールを実装する方法はありません。

+0

これは私がドキュメントで見つけたのと同じですが、残念です。どのようにprotobufがこのような問題に対処しているのか、proto3のデフォルトと区別するためにいくつかのカスタムデフォルトを定義しているように思えるでしょうか? – sll

+0

@sll Proto3もカスタムデフォルトをサポートしていません。ゼロ/空のみ。しかし、実際には、この検証を行う必要はありません。デフォルト値が受け入れ可能な入力であれば、それを続けてください。送信者は、自分が望む値を送信していることを確認する必要があります。サーバーで検証する必要があるのは、送信した値がサーバーに損害を与えないことだけです。 –

関連する問題