1


0

ASP.NETのJavaScriptSerializerクラスのSerializeメソッドをオーバーライドしたいです。 それほど派手ではありませんが、.NETから返されたシリアル化された文字列に追加の後処理を実行したいだけです。

残念ながら、このクラスのメソッドは仮想宣言されておらず、クラス自体はインタフェースまたは抽象クラスから派生していません(拡張性を目的として設計されたコア.NET Frameworkクラスの数を考えると奇妙な見落としのようです)。

この件に関して私が行ったいくつかの読みに基づいて、私は選ぶべきいくつかの選択肢があるようです。

  • 拡張メソッドを作成します。 クラスコンシューマが知っておく必要がある新しいメソッド(コンパイラが同じ名前/署名を2回使用することを許可しない)を作成することを含むので、私はこのオプションの大ファンではありません。

  • まったく同じシグネチャを持つJavaScriptSerializerから新しいクラスを派生させます。 JavaScriptSerializerには仮想メソッドがないので、メソッドの隠蔽を実行するために、各メソッド/プロパティの宣言に "new"キーワードを使用します。 このオプションはデコレータパターンと考えていますか?

  • JavaScriptSerializerと同じシグネチャを持つ、IJavaScriptSerializerという新しいインターフェイスを作成します。 私のコードからJavaScriptSerializerへの参照をすべて削除し、新しく作成したインターフェイスへの参照を置き換えます。

追加のアプローチとそれぞれのアプローチの長所/短所について聞きたいです。

読んでくれてありがとう。

2 Answer


3


クラスを継承し、そのクラスの別のインスタンスをラップするオブジェクトを指すhttp://en.wikipedia.org/wiki/Decorator_Pattern[Decorator Pattern]を誤解しているでしょう。 (これはストリームでは非常に一般的です)。 あなたの場合は、それは適用外です。

私はあなたが同一のAPIを持つことを試みることなしに、 `JavaScriptSerializer`クラスのためにあなた自身の置き換え(またはラッパー、あなたが必要とする方)を作ることを勧めます。 実装を入れ替える必要がある場合は、コアメソッドを使用してインターフェイスまたは基本クラスを作成し、元のものをラップするものと後処理を追加するものの2つの具象実装を使用します。

一般に、クラスを設計するときは、.NET Frameworkの組み込みクラスをコピーするのではなく、ニーズを満たすように設計する必要があります。


0


JSONシリアライゼーションのためのhttp://json.orgおよびd / lソースコードを持ついくつかのクラスの1つにアクセスします。

その後、後処理に入れてコンパイルし、プロジェクトで使用します。

理想的には、この時点で拡張メソッドを作成するので、これを実行できます。

リストs = fillObject(); s.ToJSON()を返します。