对象实例的序列化,是指把实例对象转换为可方便存储、传输和交互的流。
实例对象 <-----> 流
而对象的实例则包含类型的成员变量、类型的名称以及对象所在的程序集等信息。
在.NET中,通过Serializable特性提供了序列化对象实例的机制。当一个类型被申明为Serializable后,它就能被诸如BinaryFormatter等实现了IFormatter接口的类型对象进行序列化和反序列化。
[Serializable]
public class MyObject
{
private int myInt;
private string myString;
public MyObject(int i, string s)
{
myInt = i;
myString = s;
}
}
可以通过申明Serializable特性来使类型的对象可以被序列化,同时,对于一些特殊的不希望被序列化的成员,可以为其添加NonSerialized特性。
using System;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace Test
{
class UseSerializable
{
static void Main()
{
MyObject obj = new MyObject(10, "我是字符串");
Console.WriteLine("初始状态:");
Console.WriteLine(obj);
//序列化对象
byte[] bytes = Serialize(obj);
//反序列化对象
MyObject newObj = DeSerialize(bytes);
Console.WriteLine("经过序列化和反序列化后:");
Console.WriteLine(newObj);
Console.Read();
}
//序列化对象
static byte[] Serialize(MyObject obj)
{
//二进制序列化
IFormatter formatter = new BinaryFormatter();
using (MemoryStream ms=new MemoryStream ())
{
formatter.Serialize(ms, obj);
return ms.ToArray();
}
}
//反序列化对象
static MyObject DeSerialize(byte[] bytes)
{
IFormatter formatter = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream (bytes))
{
return formatter.Deserialize(ms) as MyObject;
}
}
}
//一个可序列化的类型
[Serializable]
public class MyObject
{
int _myInt;
[NonSerialized]
string _myPrivate;
public MyObject(int i, string s)
{
_myInt = i;
_myPrivate = s;
}
public override string ToString()
{
return new StringBuilder().AppendFormat("整数是:{0}\r\n字符串是:{1}",_myInt.ToString(),_myPrivate).ToString();
}
}
}
序列化前后对象的变化:对于_myInt成员,其顺利地通过反序列化还原了初始值:而_myPrivate成员,由于NonSerialized的作用而丢失了初始值。下面是程序的执行结果: