2009-04-22 66 views
13

说我有几个基本的对象,像这样:如何在事先不知道类型的情况下反序列化XML?

[Serializable] 
public class Base 
{ 

    public string Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

[Serializable] 
public class Sub: Base 
{ 
    public List<string> Property3 { get; set; } 

    public Sub():base() 
    { 
     Property3 = new List<string>(); 
    }   
} 

我连载他们像这样:

Sub s = new Sub {Property1 = "subtest", Property2 = 1000}; 
s.Property3.Add("item 1"); 
s.Property3.Add("item 2"); 

XmlSerializer sFormater = new XmlSerializer(typeof(Sub)); 
using (FileStream fStream = new FileStream("SubData.xml", 
    FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    sFormater.Serialize(fStream, s); 
} 

我如何反序列化他们,让我找回正确的类?

如,我想是这样的

XmlSerializer bFormater = new XmlSerializer(typeof (Base)); 
Base newBase; 
using (FileStream fStream = new FileStream("BaseData.xml", 
    FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    newBase = (Base) bFormater.Deserialize(fStream); 
} 

除非我能够通过它的XML文件,从基本下降和正确的类将被创建的任何类。

我在想我可以读取XML根节点的名称并使用switch语句来创建正确的XmlSerializer,但我想知道是否有更简单的方法。

+0

好的。刚刚检查。它抛出一个例外。已删除最后一个段落。 – Kirtan 2009-04-22 04:50:32

+0

好的,删除了我的评论,因为它不再适用。 – Ray 2009-04-22 05:14:10

回答

8

使用[XmlInclude]属性上你的基类来讲述派生类XML序列化,所以它可以找出创建的内容。您的最后一段代码应该可以正常工作。

9

可以读取XML文件的根节点,而不是使用switch语句,你可以写你这样的代码 -

Type yourType = Type.GetType("Your Type"); 
XmlSerializer xs = new XmlSerializer(yourType); 

我不认为还有比读取XML其他任何方式,因为如果你不知道这种类型,你什么都做不了。

0

据我所知,没有更简单的方法来做到这一点。

我个人更喜欢更通用的解决方案(因为我必须序列化我的代码中的很多不同的类):保持类型名称与值一起序列化。

你可以看看这个问题的一些细节: Serialise to XML and include the type of the serialised object

相关问题