C# XML序列化限制与XmlIgnore用法详解
C#使用XmlSerializer进行XML序列化时受到严格限制,包括必须拥有无参构造函数、仅处理公共成员以及不支持某些复杂类型。本文详细解析这些限制,并通过代码演示如何使用[XmlIgnoreAttribute]标记排除特定属性,从而顺利生成XML文件。
XML序列化的核心限制
在C#开发中,二进制序列化通常能保留类的私有字段和所有数据细节,但XML序列化则更为严格。若要将自定义类(如Arwen)成功转换为XML格式,必须注意以下三个主要约束:
- 成员可见性:
XmlSerializer默认只能序列化公共的(public)字段或属性,私有的或受保护的数据将被忽略。 - 数据类型兼容性:并非所有类型都能被序列化。例如标准库中的
Hashtable和TimeSpan等类型,如果未在内部实现特定的接口(如IXmlSerializable),通常会引发异常。 - 构造函数要求:目标类必须包含一个公开的无参数构造函数,以便反序列化器创建新实例时能够正常工作。
处理不支持的类型与XmlIgnore用法
当类中包含上述不受支持的类型(如Hashtable或TimeSpan)时,简单的“曲线救国”方式(如转换为列表结构)虽然可行但较为繁琐。更常用的做法是使用[XmlIgnore]特性显式告知序列化器忽略这些字段。
第1步:定义带有特性的数据类
首先引入必要的命名空间System.Xml.Serialization和System.IO。在类定义中,对不想存入XML的属性添加[XmlIgnore]标注,并确保存在空的无参构造函数:
using System.Xml.Serialization;
using System.IO;
class Arwen
{
private Hashtable table = new Hashtable();
private TimeSpan time = new TimeSpan(0, 0, 1);
public Arwen()
{
// 必须有
}
[XmlIgnore]
public Hashtable Table
{
get { return table; }
set { table = value; }
}
[XmlIgnore]
public TimeSpan Time
{
get { return time; }
set { time = value; }
}
}
第2步:执行序列化操作
初始化对象并准备文件路径,使用XmlSerializer生成XML流:
Arwen weiwen = new Arwen();
weiwen.Time = new TimeSpan(1, 2, 3); // 1小时 2分钟 3秒
weiwen.Table.Add("arwen", 250);
string filename = @"c:\temp\arwen.xml";
XmlSerializer xs = new XmlSerializer(typeof(Arwen));
using (FileStream file = new FileStream(filename, FileMode.Create))
{
xs.Serialize(file, weiwen);
}
由于使用了[XmlIgnore],生成的XML文件中将不包含Table和Time的内容。如果需要保存这些数据,建议额外提供相应的公开属性作为转换器(例如使用string属性来映射TimeSpan)。
总结
掌握C# XML序列化的限制对于数据处理至关重要。通过遵循无参构造函数规则和合理使用[XmlIgnore]属性,可以有效解决常见类型的序列化问题。以上就是关于C# XML序列化注意事项及代码实现的详细内容,更多关于C# XML序列化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









