C#反序列化未知的抽象类

时间:2009-04-03 02:48:19

标签: c# .net serialization abstract-class

我只熟悉序列化的基础知识,现在我已经习惯了。我有一个现有的报告系统,带有ReportBase抽象类和从基类派生的多个报告。它们各自具有在构造函数中指定的不同报告参数,有时还有额外的方法。是否可以序列化任何派生类,然后在不知道派生类类型的情况下反序列化。

或者我可以用反射做一些事情来实现它。我可能会将序列化对象存储到数据库中,因此可以将报告类添加到我想要的另一个字段中。

1 个答案:

答案 0 :(得分:4)

是的,在不知道对象的实际类型的情况下反序列化肯定是可能。实际上,您不需要知道有关类型的任何信息以进行反序列化。在二进制意义上,反序列化只是将字节数组转换为原始类型,并将引用作为对象返回。之后您可以将其强制转换为该实例的任何合法类型。

例如,以下代码将流反序列化为对象,并将引用转换为ReportBase类型。

public static void Deserialize(Stream stream)
{
    BinaryFormatter formatter = new BinaryFormatter();
    object obj = formatter.Deserialize(stream);
    ReportBase report= (ReportBase) obj;
}

请注意,我说这是可能的。为了使其工作,stream必须指向ReportBase派生类的有效序列化实例,并且该类必须符合序列化规则。

创建一个旨在但不可序列化的类非常容易:http://blogs.msdn.com/jaredpar/archive/2009/03/31/is-it-serializable.aspx