您的位置:首页 > 其它

对象序列化与反序列化 深层拷贝

2012-04-11 23:21 232 查看
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; }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: