导言:
你是否曾经想过序列化构造对象,它里面有一个集合,这个集合包含接口或者抽象类?你是否不知道所有的你要序列化的类型?好吧,如果这样,那么我可以帮助你。
使用代码:
让我们开始.首先,你将要将采用下面的帮助类,将它粘贴到你的项目之中。它将帮助你只用一行代码就能序列化一个对象为XML。
代码
现在我们已经了解这个方法了,让我们看看我们的问题所在。举一个例子,我们有一个抽象类,Animal。然后有两个继承Animal的类:Human和Dog。
代码
现在我们有一个想要序列化的对象。它是HouseHold,它的有一个Animal集合属性:
public
class
HouseHold
{
public HouseHold()
{
this .Residents = new List < Animal > ();
}
public List < Animal > Residents
{
get ;
set ;
}
}
{
public HouseHold()
{
this .Residents = new List < Animal > ();
}
public List < Animal > Residents
{
get ;
set ;
}
}
现在,我们序列化这个对象。
代码
我们将会得到下面的Exception的Message:
"
生成 XML 文档时出错。
下面是 InnerException的Message :
"不应是类型 Kirin.Human。使用 XmlInclude 或 SoapInclude 属性静态指定非已知的类型。
"
这里有个关键字“静态”, 我们可以在每个类的顶部放置XmlInclude属性解决这个问题,如:
代码
但如果我们不知道的继承Animal的所有类,如果我们的应用是可延展的,需要能够使用由用户自定义类型,上面的代码是解决不了问题的。让我们向下看,我会告诉你如何可以做到的。
首先,我们要做的是使HouseHold类实现IXmlSerializable接口,这样我们就可以拦截这个对象的序列化,我们自己去序列它。
接着,我们构建一个方法,能检查所有的类型,在这个例子中,我们使用反射去查询的所有继承了Animal类的程序集。
代码
现在,我们运行我们的测试代码,能顺利通过。希望对你有所帮助,谢谢!
本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2009/12/15/1624826.html,如需转载请自行联系原作者