我们可以通过哪些不同方式对相同/不同类型的多个对象进行XML序列化?
例如,对于相同类型的对象,通用List<T>
和ArrayList用于不同类型的对象。
此外,哪种类型的结构是XML可序列化的,哪些不是?
如果任何人都可以提供示例代码或链接,将会很有帮助。
答案 0 :(得分:4)
要通过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
的ctor中指定此关系,但这是额外的工作)
除非必须,否则我不建议使用IXmlSerializable
;这是复杂的,很难做对。更重要的是;如果你在SOAP服务上使用wsdl生成的代理对象,它根本不起作用**;另一端不会实现IXmlSerializable
。
我也不建议序列化任意对象类型的列表;如果你有一个已知类型的有限集,那么可以使用[XmlInclude]
等来完成这项工作。
答案 1 :(得分:1)
您可以使所有类实现System.Xml.Serialization.IXmlSerializable。然后,您可以拥有此类型的通用集合。然后,实现所需的ReadXml和WriteXml方法非常简单。
e.g。
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();
}
}
}
答案 2 :(得分:0)
以下是Xml serialization of collections的链接。但Chris Arnold正确实现IXmlSerializable
将允许您完全控制序列化。 Xml属性很有吸引力,因为它们是声明性的,但另一个选项值得学习(并且从我的经验来看更快)。