我們可以通過不同的方式使XML序列化多個相同/不同類型的對象?以XML格式序列化C#中多個對象的方法
例如,針對同一類型的對象 的通用List<T>
以及不同類型的對象的ArrayList。
另外,哪種類型的結構是XML可序列化的,哪些不是?
如果任何人都可以提供樣本代碼或鏈接,這將是有幫助的。
我們可以通過不同的方式使XML序列化多個相同/不同類型的對象?以XML格式序列化C#中多個對象的方法
例如,針對同一類型的對象 的通用List<T>
以及不同類型的對象的ArrayList。
另外,哪種類型的結構是XML可序列化的,哪些不是?
如果任何人都可以提供樣本代碼或鏈接,這將是有幫助的。
要通過XmlSerializer
可序列化的,您的類型必須
根據哪些構造;
List<T>
,T[]
等)的處理精細你是對的,List<T>
很適合序列化一組相似的對象。如果您正在處理子類,則可以使用[XmlInclude]
來區分類型;也就是說,如果您有:
var list = new List<ParentType>();
list.Add(new ParentType());
list.Add(new ChildType()); // Child : Parent
那麼這仍可能是序列化的,只要你有:
[XmlInclude(typeof(Child))]
public class Parent {}
public class Child : Parent {}
(你也可以指定在構造函數來XmlSerializer
這種關係,但它是額外的工作)
我不推薦使用IXmlSerializable
,除非必須;這很複雜,很難正確。更重要的是;如果您通過SOAP服務使用wsdl生成的代理對象,它根本無法工作*;另一端不會有你的IXmlSerializable
實現。
我也不建議序列化任意對象類型的列表;如果你有一個已知類型的有限集合有技巧利用[XmlInclude]
等來做到這一點。
你可以讓所有的類實現System.Xml.Serialization.IXmlSerializable。然後你可以擁有這種類型的通用集合。然後實現所需的ReadXml和WriteXml方法非常簡單。
例如
class MyClass : IXmlSerializable
{
public System.Xml.Schema.XmlSchema GetSchema()
{
}
public void ReadXml(System.Xml.XmlReader reader)
{
//TODO: read logic here...
}
public void WriteXml(System.Xml.XmlWriter writer)
{
//TODO: write logic here...
}
}
用法......
class WorkerClass
{
public void SerializeListToFile(IList<IXmlSerializable> list, string fileName)
{
using (XmlWriter writer = new XmlTextWriter(fileName))
{
foreach (IXmlSerializable item in list)
item.WriteXml(writer);
writer.Close();
}
}
}
這裏是Xml serialization of collections的鏈接。但克里斯阿諾德是正確實施IXmlSerializable
將允許您完全控制序列化。 Xml屬性是有吸引力的,因爲它們是聲明性的,但另一種選擇值得學習(並且從我的經驗來看速度更快)。
無參數構造函數不一定是公共的。 – 2009-10-05 06:25:42