序列化是将一个对象保存到存储介质上或者将对象进行转换使之能够在网络上传送的行为。在一个对象被序列化之后,你会想要将它反序列化
,也就是将数据重新转换为可用的对象的行为。这种类型的功能被用在一个对象必须被从一个上下文封送到另一个上下文的时候,例如当对象
跨越App域的时候。另外一个例子是Web服务——对象在服务器上被序列化,通过网络被(封送或)发送到的客户端,然后被反序列化成有用的
对象。
从二进制到XML,.NET框架为开发人员提供了很多序列化选项,甚至允许开发人员创建自己的序列化例程。在本文中,我将着重讨论XML的
序列化,并告诉你如何利用这一内置的功能。
XML序列化
.NET框架提供的一种形式的序列化是XML序列化。在这种类型的序列化里,对象状态被以XML格式保存。这使得被序列化的对象能够被不同
的系统取得并修改,甚至是那些不是用.NET编写的系统。另外一个优势是被序列化的对象对于人来说是可读和可写的——因此更新对象的方式
莫过于打开写字板更改其值。
XML序列化常常被来远程控制项目和Web服务项目里,虽然你可能会在别的地方发现它,比如DataSet封送。在与Xpath查询和Predicate方法
一起使用的时候,XML序列化能够被用来实现面向对象的数据库——我会在今后的文章里谈这方面的内容。
使用XML序列化
在.NET框架里利用内置的XML序列化方法相对较为容易。你只需要熟悉一些类和属性就可以开始使用简单的XML序列化了:
System.Xml.Serialization命名空间:含有使用XML序列化所需要的类和功能。这个命名空间应该被放在使用XML序列化的类的顶部的一个
“using”命令里。
XmlSerializer类:提供将对象序列化和反序列化的功能。
XmlIgnore属性:告诉XmlSerializer类跳过你不希望序列化的成员。//这个属性只有通过 构造函数传参数才会有作用Class3
[Serializable()]
public class Class2
{
private string _userName = string.Empty;
public string UserName
{
get
{
return _userName;
}
set
{
_userName = value;
}
}
public Class3 vv;
}
[Serializable]
public class Class3
{
private string _kk=String.Empty;
[XmlIgnore]private string _Description=String.Empty;
public string kk
{
set
{
_kk = value;
}
get
{
return _kk;
}
}
public string Description
{
set
{
_Description = value;
}
get
{
return _Description;
}
}
=================
//public string Description
//{
// set
// {
// _Description = value;
// }
// get
// {
// return _Description;
// }
//}
public Class3() { }
public Class3(string d)
{
_Description = d;
}
===========这样跳过你不希望序列化的成员
}
========================
Class2 cls = new Class2();
cls.UserName = "xingming!";
cls.vv = new Class3();
cls.vv.kk = "lovelove";
cls.vv.Description = "miaoshu";
XmlSerializer xs = new XmlSerializer(typeof(Class2));
Stream stream = new FileStream("f:\\1.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
xs.Serialize(stream, cls);
stream.Close();
========================
XmlSerializer xs = new XmlSerializer(typeof(Class2));
Stream stream = new FileStream("f:\\1.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Class2 p = (Class2)xs.Deserialize(stream);
MessageBox.Show(p.UserName.ToString());