Dot-Net

如何在事先不知道類型的情況下反序列化 XML?

  • May 5, 2009

假設我有幾個基本對象,如下所示:

[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);
}

除了我能夠為從 Base 派生的任何類傳遞一個 XML 文件,並且將創建正確的類。

我想我可以讀取 XML 根節點的名稱並使用 switch 語句來創建正確的 XmlSerializer,但我想知道是否有更簡單的方法。

使用[XmlInclude]基類的屬性告訴 XML 序列化器派生類,這樣它就可以確定要創建什麼。您的最後一個程式碼段應該可以正常工作。

您可以讀取 XML 文件的根節點,而不是使用 switch 語句,您可以像這樣編寫程式碼 -

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

我認為除了閱讀 XML 之外別無他法,因為如果您不知道類型,您將無能為力。

引用自:https://stackoverflow.com/questions/775647