14.3 XML串行化
使用XML串行化能够方便XML的存储或传输,能够把一个对象的公共域和属性保存为一种串行格式的过程,反串行化则是使用串行的状态信息将对象从串行XML状态还原为初始状态的过程。.NET Framework提供了命名空间来简化开发人员进行XML串行化。
14.3.1 XmlSerializer串行化类
.NET Framework提供了System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能。而System.Xml.Serialization提供了一个XmlSerializer类,该类可以将一个对象串行和反串行化为XML格式。XmlSerializer类虽然能够执行串行化和反串行化,但是串行化和反串行化有一个最大的区别,就是串行化调用Serialize方法,而反串行化调用Deserialize方法。
如果需要将一个对象进行XML串行化,可以在类前添加[Serializable()]标识,声明一个定制串行化属性,如果需要将整个类都能够支持串行化,则必须添加该属性。XML串行化还包括以下属性:
1)[XmlRoot]:用来识别作为XML文件根元素的类或结构,可以用此标记把一个元素的名称设置为根元素。
2)[XmlElement]:共有的属性或字段可以作为一个元素被串行化到XML结构中。
3)[XmlAttribute]:共有的属性或字段可以作为一个属性被串行化到XML结构中。
4)[XmlIgnore]:共有的属性或字段不包括在串行化的XML结构中。
5)[XmlArray]:共有的属性或字段可以作为一个元素数组被串行到XML结构中。
6)[XmlArrayItem]:用来识别可以放到一个串行化数组中的类型。
14.3.2 基本串行化
基本串行化是指让.NET Framework自动的对对象进行串行化操作。使用基本串行化进行操作,只要求对象拥有类属性[Serializable()]即可。如果类中的某些属性或字段不需要进行串行化操作,则使用[NonSerializable()]属性即可,示例代码如下所示。
上述代码使用了[Serializable()]属性声明一个类,则该类的成员都能够被串行化,而Age属性使用了[NonSerializable()]属性声明了该属性不应被串行化。使用[NonSerializable()]能够精确的控制串行化。若需要将类进行XML串行,则可以通过使用[XmlAttribute]等属性进行XML串行化操作,示例代码如下所示。
上述代码运行后的结果形式呈现为XML格式,其格式如下所示。
<Shop>this.Shop</Shop>
<Name>this.Name</Name>
<Phone>this.Phone</Phone>
<Seller>this.Seller</Seller>
//<Age></Age>
在串行化结果输出时,并没有输出Age标签,是因为在Age属性前定义了[NonSerializable()]以控制该字段不会被串行化输出。
14.3.1 XmlSerializer串行化类
.NET Framework提供了System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能。而System.Xml.Serialization提供了一个XmlSerializer类,该类可以将一个对象串行和反串行化为XML格式。XmlSerializer类虽然能够执行串行化和反串行化,但是串行化和反串行化有一个最大的区别,就是串行化调用Serialize方法,而反串行化调用Deserialize方法。
如果需要将一个对象进行XML串行化,可以在类前添加[Serializable()]标识,声明一个定制串行化属性,如果需要将整个类都能够支持串行化,则必须添加该属性。XML串行化还包括以下属性:
1)[XmlRoot]:用来识别作为XML文件根元素的类或结构,可以用此标记把一个元素的名称设置为根元素。
2)[XmlElement]:共有的属性或字段可以作为一个元素被串行化到XML结构中。
3)[XmlAttribute]:共有的属性或字段可以作为一个属性被串行化到XML结构中。
4)[XmlIgnore]:共有的属性或字段不包括在串行化的XML结构中。
5)[XmlArray]:共有的属性或字段可以作为一个元素数组被串行到XML结构中。
6)[XmlArrayItem]:用来识别可以放到一个串行化数组中的类型。
14.3.2 基本串行化
基本串行化是指让.NET Framework自动的对对象进行串行化操作。使用基本串行化进行操作,只要求对象拥有类属性[Serializable()]即可。如果类中的某些属性或字段不需要进行串行化操作,则使用[NonSerializable()]属性即可,示例代码如下所示。
+展开
-C#
using System.Xml.Serialization;
namespace Ser
{
[Serializable()]//设置串行化属性
class MySer
{
private string Shop { get; set; }//设置Shop属性
private string Name { get; set; }//设置Name属性
private string Phone { get; set; }//设置Phone属性
private string Seller { get; set; }//设置Seller属性
[NonSerialized()]//设置非串行化
private string Age { get; set; } //设置Age属性
}
}
namespace Ser
{
[Serializable()]//设置串行化属性
class MySer
{
private string Shop { get; set; }//设置Shop属性
private string Name { get; set; }//设置Name属性
private string Phone { get; set; }//设置Phone属性
private string Seller { get; set; }//设置Seller属性
[NonSerialized()]//设置非串行化
private string Age { get; set; } //设置Age属性
}
}
上述代码使用了[Serializable()]属性声明一个类,则该类的成员都能够被串行化,而Age属性使用了[NonSerializable()]属性声明了该属性不应被串行化。使用[NonSerializable()]能够精确的控制串行化。若需要将类进行XML串行,则可以通过使用[XmlAttribute]等属性进行XML串行化操作,示例代码如下所示。
+展开
-C#
using System.Xml.Serialization;
namespace Ser
{
[Serializable()]//设置串行化
[XmlRoot("SerXML")]
class MySer
{
[XmlElement("Shop")]//设置节点属性
private string Shop { get; set; }//设置Shop属性
[XmlElement("Name")]//设置节点属性
private string Name { get; set; }//设置Name属性
[XmlElement("Phone")]//设置节点属性
private string Phone { get; set; }//设置Phone属性
[XmlElement("Seller")]//设置节点属性
private string Seller { get; set; }//设置Seller属性
[NonSerialized()]//设置非串行化
[XmlElement("Age")]//设置节点属性
private string Age { get; set; }//设置Age属性
}
}
namespace Ser
{
[Serializable()]//设置串行化
[XmlRoot("SerXML")]
class MySer
{
[XmlElement("Shop")]//设置节点属性
private string Shop { get; set; }//设置Shop属性
[XmlElement("Name")]//设置节点属性
private string Name { get; set; }//设置Name属性
[XmlElement("Phone")]//设置节点属性
private string Phone { get; set; }//设置Phone属性
[XmlElement("Seller")]//设置节点属性
private string Seller { get; set; }//设置Seller属性
[NonSerialized()]//设置非串行化
[XmlElement("Age")]//设置节点属性
private string Age { get; set; }//设置Age属性
}
}
上述代码运行后的结果形式呈现为XML格式,其格式如下所示。
<Shop>this.Shop</Shop>
<Name>this.Name</Name>
<Phone>this.Phone</Phone>
<Seller>this.Seller</Seller>
//<Age></Age>
在串行化结果输出时,并没有输出Age标签,是因为在Age属性前定义了[NonSerializable()]以控制该字段不会被串行化输出。
加支付宝好友偷能量挖...