序列化和持久化:
描述对象状态以某种形式存储到文件,以及后来的恢复该对象状态。
Serializable属性:
默认,用户定义类型(类,结构)不可序列化,需要显示用[Serializable]特性修饰自定义类型。
不可序列化成员:
当一个类可序列化,.NET检查其下所有成员变量都可以序列化。当序列化时,.NET发现不可序列化成员会抛出异常。
对不可序列化的成员,应该用[NonSerialized]特性修饰,这样在序列化时会忽略跳过该成员。在反序列化时,会将不可序列化对象先初始化为默认值,再用自定义步骤将之初始化为正确值。
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
[Serializable]
public class MyClass : IDeserializationCallback
{
//该字段将不被序列化
[NonSerialized]
private int m_Number = 1;
#region IDeserializationCallback 成员
//在反序列化后调用,初始未序列化字段
public virtual void OnDeserialization(object sender)
{
//输出:0
Console.WriteLine(m_Number);
m_Number = 3;
//输出:3
Console.WriteLine(m_Number);
}
#endregion
}
static void Main(string[] args)
{
#region 序列化
//MyClass mc = new MyClass();
//IFormatter formatter = new BinaryFormatter();
//Stream stream = new FileStream(@"D:\66_Code\Se\obj.bin", FileMode.Create, FileAccess.Write);
//using (stream)
//{
// formatter.Serialize(stream, mc);
//}
#endregion
#region 反序列化
MyClass obj;
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"D:\66