我只熟悉序列化的基础知识,现在我有了它的用处。我有一个现有的报告系统,其中包含一个 ReportBase 抽象类和多个从基类派生的报告。这些每个都有在构造函数中指定的不同报告参数,有时还有额外的方法。是否可以序列化任何派生类,然后在不知道派生类类型的情况下反序列化。
或者,我可以通过反射做一些事情来实现它。我可能会将序列化的对象存储到数据库中,因此可以将报告类添加到我想的另一个字段中。
我只熟悉序列化的基础知识,现在我有了它的用处。我有一个现有的报告系统,其中包含一个 ReportBase 抽象类和多个从基类派生的报告。这些每个都有在构造函数中指定的不同报告参数,有时还有额外的方法。是否可以序列化任何派生类,然后在不知道派生类类型的情况下反序列化。
或者,我可以通过反射做一些事情来实现它。我可能会将序列化的对象存储到数据库中,因此可以将报告类添加到我想的另一个字段中。
是的,当然可以在不知道对象的实际类型的情况下进行反序列化。事实上,为了反序列化,您不需要知道任何关于类型的信息。在二进制意义上,反序列化只是将字节数组转换为原始类型并将引用作为对象返回。之后,您可以自由地将其转换为实例的任何合法类型。
例如,以下代码会将流反序列化为对象并将引用转换为 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