2

シリアル化されたオブジェクトをjson(または将来的にはxml)としてデータベースに保存しています。後で、このオブジェクトはプルされ、デシリアライズされます。基本クラスは HighChart ですが、HighChart.ColumnBarChart などのいくつかの派生型もあります。グラフのタイプは JSON に格納されます。問題は、逆シリアル化するクラスを動的に選択する方法がわからないことです。

私のソリューションでは、将来の派生型を自動的に考慮に入れる方法を提供する必要があります (グラフの種類の数を増やす予定であり、グラフの種類ごとに何か新しいものをプログラムする必要はありません)。

タイプを別の DB フィールドに格納できることはわかっていますが、すべてのタイプの Deserialize メソッドで switch ステートメントを使用する必要があります。また、json 文字列を解析してチャート タイプを検出することもできますが、考えられるすべてのタイプに対して switch ステートメントを使用する必要があります。

ご感想ありがとうございます!

4

2 に答える 2

3

新しい型のAssembly Qualified Nameをデータベースに格納すると、それを使用して型の読み込みコードを変更せずに型のインスタンスをインスタンス化できます。実装は次のようになります。

        string assemblyQualifiedName = getAssemblyQualifiedNameFromDatabase();

        var futureType = Type.GetType(assemblyQualifiedName);

        var serializer = new DataContractJsonSerializer(futureType);

        var result = (HighChart)serializer.ReadObject(stream);

case ステートメントがないことに注意してください。実際の型を事前に知る必要はありません。ただし、このコードは、プロジェクトに直接または参照によって新しい型が含まれていることを前提としています。新しい型への参照を使用して再コンパイルされていないアセンブリを使用して新しい型を動的に読み込む場合は、新しい型を含むアセンブリを読み込み、読み込まれたアセンブリへの参照を使用する必要があります。型参照を作成します。

于 2013-07-13T03:08:07.350 に答える