以XML格式序列化C#中多个对象的方法
我们可以通过不同的方式使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