2

MVVMパターンで使用できるデスクトップ、Web、およびモバイル用の単一オブジェクトモデルを使用するようにアーキテクチャを更新しています。コントローラのインターフェイスを使用して、WebAPIを介してシリアル化されるデータフィールドを制限できるようにしたいと思います。モバイル用のモデルオブジェクトはHTML5ローカルストレージに保存されるため、これが必要です。シンデスクトップクライアントがより多くのデータを保存(および操​​作)できる間は、オプションのデータを伝送しないでください。

これを実現するために、モデルは、シリアル化するデータフィールドを定義するさまざまなインターフェイスを実装し、インターフェイスに固有のコントローラーが存在します。

問題は、返されるインターフェイスの一部でなくても、WebAPIがモデル内のすべてのフィールドを常にシリアル化することです。返されたインターフェイスのフィールドのみをシリアル化するにはどうすればよいですか?

4

3 に答える 3

2

オブジェクト全体ではなく、特定のインターフェイスのシリアル化のプロセスを自動化する方法を考えています。
そのようなコードを内部に含むライブラリを作成しました(今のところ、このコードはgithub gistによって共有されています)。ToDynamicという名前の拡張メソッドを公開します。

public static dynamic ToDynamic<T>(this T value, bool deep = true);

特定の T を使用して、その T タイプで使用可能なフィールドを抽出します。
次の例では、T は自動的に決定されます。
したがって、IClub メンバーのみが抽出され、シリアル化されます。

IReadOnlyList<IClub> clubs = retrieving.GetClubs(page, size, criteria);

return this.Request.CreateResponse(HttpStatusCode.OK, clubs.Select(item => item.ToDynamic()));
于 2014-04-28T12:42:50.837 に答える
1

JsonConverter または ContractResolver を使用してこれを行うことができると思います

を作成JsonConverterしてオーバーライドし、WriteJsonロジックを記述して、必要なデータのみをシリアル化します。CanConvertと もオーバーライドすることを忘れないでくださいCanWriteJSON.NET での特定のオブジェクトのカスタム変換のリンクを見て、アイデアを得ることができます。

ContractResolver については、リンクhttp://quickduck.com/blog/2011/08/08/overriding-the-default-serialization-behavior-in-json-net/を参照してください。これを使用する代わりbase.CreateObjectContract( objectType );new JsonObjectContract( objectType );

お役に立てれば

于 2012-11-27T12:13:19.547 に答える
0

インターフェースのみを実装する新しいクラスを作成し(「ビューモデル」を作成)、必要なフィールドでそのクラスを初期化し、オブジェクトを返すソリューションです。

または、可能であれば、フィールドを非公開にします。プライベート フィールドはシリアル化されません。(フィールドの可視性を制限することは常に良いことです)

于 2012-11-27T11:02:16.843 に答える