对象序列化与反序列化 深层拷贝
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; }
}
今天看了一下序列化的问题,感觉挺神奇的,代码如下:
//序列化与反序列化
//序列化 就是可以 把你建的一个对象有文件保存起来
//比如说你把建好的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; }
}
相关文章推荐
- 对象序列化与反序列化 深层拷贝
- 对象的深拷贝-序列化拷贝
- 深拷贝浅拷贝[对象序列化]
- java提高篇(五)-----使用序列化实现对象的拷贝
- 序列化实现对象的拷贝
- java提高篇(五)-----使用序列化实现对象的拷贝
- 利用序列化将java对象深拷贝
- 使用序列化实现对象的拷贝
- java提高篇(五)-----使用序列化实现对象的拷贝
- Java对象的深层拷贝
- 使用序列化实现对象的拷贝
- 使用序列化实现对象的拷贝(转载)
- 对象 序列化 实现深拷贝
- [编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝
- 解决用序列化方式实现对象拷贝时出的异常解决方法
- Java提高篇(五):使用序列化实现对象的拷贝
- js对象的深层 拷贝
- 使用序列化实现对象的拷贝
- 使用序列化实现对象的拷贝
- [编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝