2012年4月11日 天氣 有雨 真正的春雨來了,雖然下雨,不像上個月的雨期了,心情不錯!
今天看了一下序列化的問題,感覺挺神奇的,代碼如下:
//序列化與反序列化
//序列化 就是可以 把你建的一個對象有文件保存起來
//比如說你把建好的list<string>存了很多值,但程序關閉了,值就不存在了,你想用文件保存起來,下次再用
//或者把你的對象通過socket發給另外一個程序調用
//反序列化把你序列化的文件流轉換成對象,以便調用
//序列化
static void simple6_1()
{
List<string> list = new List<string>();
list.Add("zhangfeng is a SB!");
list.Add("SB have many");
list.Add("SB is smiling");//新建一list對象 並添加值
BinaryFormatter fb = new BinaryFormatter();//創建一個序列化對象
using (FileStream fs = new FileStream("c:\\a.dat",FileMode.Create))
{
fb.Serialize(fs, list);//對象序列化
}
}
//反序列化
static void simple6_2()//在asp.net 中 viewState 和session 可能用到
{
BinaryFormatter fb = new BinaryFormatter();
using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Open))
{
object obj= fb.Deserialize(fs);//對象反序列化
List<string> list = (List<string>)obj;
foreach (string s in list)
{
Console.WriteLine(s);//輸出
}
}
}
//複雜序列化
//複雜在哪呢,就是自建一個對象,對象中一個屬性是自己類的對象,序列化一個對象後,怎樣保存他指向的對象的值
//這裏面序列化一個對象,其實保存了兩個對象的值
static void simple7_1()
{
person p1 = new person();
p1.ID = 1;
p1.Name = "老布什";
p1.Age = 50;
person p2 = new person();
p2.ID = 2;
p2.Name = "小布什";
p2.Age = 20;
p2.parent = p1;
BinaryFormatter fb = new BinaryFormatter();//創建一個序列化對象
using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Create))
{
fb.Serialize(fs, p2);//對象序列化
}
}
static void simple7_2()
{
BinaryFormatter fb = new BinaryFormatter();
using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Open))
{
object obj = fb.Deserialize(fs);//對象反序列化
person p = (person)obj;
Console.WriteLine(p.parent.Name);//輸出老布什
}
}
//對象序列化的應用 深層拷貝
static object DeepCopy(object src)
{
BinaryFormatter bf = new BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(StreamingContextStates.Clone));
using (MemoryStream stream = new MemoryStream())
{
bf.Serialize(stream, src);
stream.Position = 0;
return bf.Deserialize(stream);
}
}
//深層拷貝調用
//爲什麼我們要用到深層拷貝,因爲有時候建了一個對象 想要更改 又想保存原來的值 普通拷貝 只是淺層拷貝
static void simple8()
{
person p1 = new person();
p1.ID = 1;
p1.Name = "老布什";
p1.Age = 50;
person p2 = new person();
p2.ID = 2;
p2.Name = "小布什";
p2.Age = 20;
p2.parent = p1;
person p = (person)DeepCopy(p2);
Console.WriteLine(p.parent.Name);//輸出老布什
}
//類定義:
[Serializable]//標記 標記是可以序列化,不是每個對象都可以序列化的,自寫的要標記可序列化
class person
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public person parent { get; set; }
}