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