2011-06-21 9 views
2

私は、ASP.NETアプリケーションでビジネスオブジェクトを直列化および逆シリアル化するために使用するクラスを持っています。 DataContractJsonSerializerの静的インスタンス - 良いデザインか悪いデザインですか?

private static DataContractJsonSerializer m_serializer = new DataContractJsonSerializer(typeof(MyBusinessObject)); 
...とクラスの2つの静的メソッド:これらの方法では

public static string SerializeJson(MyBusinessObject bo); 

public static MyBusinessObject DeserializeJson(string json); 

が、私は静的DataContractJsonSerializerオブジェクト(m_serializer)を使用する

クラスは、この静的変数が含まれていますシリアライゼーションとデシリアライズを実行します。この方法では、各呼び出しに対してDataContractJsonSerializerインスタンスをインスタンス化する必要はありません。

このように静的変数を使用するのは正しい設計ですか?

serialize/deserializeコードで多くのヒットを取得した場合、問題に遭遇できますか?

毎秒100回の同時ヒットが発生するウェブサイトから呼び出されます。

答えて

2

Alexが言及したように、になります。クラスのドキュメントにはスレッドセーフではありません(少なくともオブジェクトの読み書きに使用されるメソッドではありません)。リフレクターをすばやく見ることで、シリアライゼーションが実際に機能するように思えます(異なるオブジェクトで同時に同じオブジェクトを直列化していないとすれば、それはまったく新しいワームです)。内部実装の詳細なので、新しいバージョンのフレームワークでは、クラスにいくつかの変更(つまり、最適化)があり、それはもはや真実ではない可能性があります。

オプションは、再利用できるシリアライザのプールを持つことです。あなたのコードは、プールから1つのシリアライザを取り出し、シリアライズ/デシリアライズに使用してプールに返します。このようにすると、インスタンスを再利用する利点がありますが、スレッドで安全でないクラスを複数のスレッドで使用するリスクはありません。

最後に、シリアライザの作成が本当に問題(プロファイリングによる)であることを確認しましたか?あなたのシナリオでは、時間がかかりすぎる可能性があり、何らかの再利用を使用すると、コードに不要な複雑さが加わるだけです。

+1

限られたテストでは、静的変数を使用するか、呼び出しごとに1つを初期化するかにかかわらず、パフォーマンスはおおよそ同等であるようです。 – frankadelic

+0

この場合、コードの最適化について心配する必要はありません。コードを簡単に作成して管理してください。マスタークヌスが言ったように、「時期尚早の最適化はすべての悪の根源です。 – carlosfigueira

関連する問題