私が使用しているシステムのコレクション用に、不可知論者のビューアーを作成しています。このビューアは、特定のシステムのコンテキストを知らなくても、データの一般的な構造を表示します。
から継承する型のみFoo<T>
を含むメモリ ストリームを逆シリアル化しようとしています。不可知論者の視点から見ると、私が必要とするすべてのデータは Foo にあります。部分は関係ありません。Foo<T>
Foo
<T>
型 T は別のアセンブリで定義されています。通常の操作では、システムには適切なコンテキスト アセンブリがすべて読み込まれていることは明らかです。問題は、ビューアの実行時に、コンテキスト アセンブリがまったく読み込まれないことです。Foo のインスタンスを逆シリアル化しようとすると、参照されているアセンブリが読み込まれていないため、明らかに例外が発生します。
必要なすべての参照アセンブリが読み込まれているかどうかを検出しようとしているため、データを逆シリアル化するか、クラスの他の側面から必要なデータを再構築するかを判断します。
非常に単純な例外 try/catch ブロックを使用してこれを実行できることはわかっていますが、これは例外ケースではありません。これは、データをロードするときに何千回とは言わないまでも、何百回も発生することを知っています。ブレーク オン 例外をオンにしたいので、これは悪夢の原因になる可能性があります。私はまた、「例外 - ヒントは名前にある」という考え方に同意しているため、例外は主要なケース コードの一部を構成するべきではありません。
--------2013 年 10 月 21 日編集 ------------
完全な説明用の例については、こちらを参照してください。重要な部分は次のとおりです。
共通に定義された Foo クラス:
[Serializable]
public class Foo
{
public string Agnostic { get; set; }
}
[Serializable]
public class Foo<T> : Foo
{
public string Contextual { get; set; }
}
コンテキスト保存:
BinaryFormatter bf = new BinaryFormatter();
FileInfo tempFile = TempFileGetter.GetTempFile();
Foo<Bar> fooBar = new Foo<Bar>();
fooBar.Agnostic = "Agnostic";
fooBar.Contextual = "Contextual";
using (var fs = tempFile.OpenWrite())
{
bf.Serialize(fs, fooBar);
fs.Flush();
}
不可知ローディング:
BinaryFormatter bf = new BinaryFormatter();
FileInfo tempFile = TempFileGetter.GetTempFile();
using (var fs = tempFile.OpenRead())
{
Foo foo = (Foo)bf.Deserialize(fs);
Controls.DataContext = foo;
}
つまり、このコードにはロケット科学は何もありません。「不可知論者」ビューアーがコンテキスト ビューアーを参照としてロードする場合、正常にロードされますが、常にそうするとは限らないため、これを行いたくありません。ロードするコンテキスト ライブラリがあります。