我正在为我正在使用的一系列系统编写一个不可知论的查看器。此查看器将向我展示我的数据的通用结构,而无需了解特定系统的上下文。
我正在尝试反序列化仅包含继承自的类型Foo<T>
的内存流。从不可知论者的角度来看,我需要的所有数据都在 Foo 中。部分无关紧要。Foo<T>
Foo
<T>
类型 T 在另一个程序集中定义。在正常操作下,系统显然已经加载了所有适当的上下文程序集。问题是在运行查看器时,没有加载任何上下文程序集。当我尝试反序列化 Foo 的实例时,我显然得到了一个异常,因为没有加载引用的程序集。
我正在尝试检测是否已加载所有必需的引用程序集,从而知道是否尝试反序列化数据,或从类的其他方面重建我需要的数据。
我知道我可以使用一个非常简单的异常 try/catch 块来做到这一点,但是,这不是异常情况。我知道当我加载数据时这会发生数百次,如果不是数千次,这可能会给我带来一场噩梦,因为我喜欢打开异常中断。我还赞同说“异常 - 提示就在名称中”的思想流派,因此异常不应构成您的主要案例代码的一部分。
--------编辑 21/10/2013------------
请参阅此处以获取完整的说明性示例,但以下是重要的部分:
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;
}
我的意思是,这段代码中没有任何火箭科学,而且,如果“不可知”查看器将上下文查看器加载为参考,那么它加载得很好,但是,我不想这样做,因为我们不会总是有要加载的上下文库。