序列化与反序列化
View Code
1 private void button1_Click(object sender, EventArgs e) 2 { 3 List<string> list = new List<string>(); 4 list.Add("DirectX游戏开发"); 5 list.Add("高等数学"); 6 list.Add("C++开发"); 7 8 BinaryFormatter bf = new BinaryFormatter(); 9 using(Stream stream = File.OpenWrite(@"c:\1.dat")) 10 { 11 //序列化 12 bf.Serialize(stream, list); 13 } 14 15 } 16 17 private void button2_Click(object sender, EventArgs e) 18 { 19 BinaryFormatter bf = new BinaryFormatter(); 20 using (Stream stream = File.OpenRead(@"c:\1.dat")) 21 { 22 //反序列化。De:反。 23 //compile→decompile 24 //compress→decompress。 25 //encrypt一decrpt??? 26 object obj = bf.Deserialize(stream); 27 List<string> list = (List<string>)obj; 28 foreach (string s in list) 29 { 30 MessageBox.Show(s); 31 } 32 } 33 34 //foreach (string s in list) 35 //{ 36 // MessageBox.Show(s); 37 //} 38 }
•对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
•BinaryFormatter类有两个方法:
–void Serialize(Stream stream, object graph)对象graph序列化到stream中
–object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象
可以序列化复杂的对象:
View Code
private void button3_Click(object sender, EventArgs e)
{
//int i = DateTime.Now.Second;
//BinaryFormatter bf = new BinaryFormatter();
//using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
//{
// //序列化
// bf.Serialize(stream, i);
//}
Person p1 = new Person();
p1.Name = "老布什";
p1.Age = 80;
p1.Id = 1;
Person p2 = new Person();
p2.Name = "小布什";
p2.Age = 50;
p2.Id = 2;
p2.Parent = p1;
BinaryFormatter bf = new BinaryFormatter();
using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
{
//序列化
bf.Serialize(stream, p2);
}
}
private void button4_Click(object sender, EventArgs e)
{
//BinaryFormatter bf = new BinaryFormatter();
//using (Stream stream = File.OpenRead(@"c:\i1.dat"))
//{
// //反序列化。De:反。
// //compile→decompile
// //compress→decompress。
// //encrypt一decrpt???
// object obj = bf.Deserialize(stream);
// int i = (int)obj;
// i++;
// MessageBox.Show(i.ToString());
//}
BinaryFormatter bf = new BinaryFormatter();
using (Stream stream = File.OpenRead(@"c:\i1.dat"))
{
//反序列化。De:反。
//compile→decompile
//compress→decompress。
//encrypt一decrpt???
Person p = (Person)bf.Deserialize(stream);
MessageBox.Show(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; }
public Dog Pet { get; set; }
}
应用:可用于对象的深度拷贝
pr
View Code
1 private Person Person1; 2 private Person Person2; 3 4 5 private void button3_Click(object sender, EventArgs e) 6 { 7 //int i = DateTime.Now.Second; 8 //BinaryFormatter bf = new BinaryFormatter(); 9 //using (Stream stream = File.OpenWrite(@"c:\i1.dat")) 10 //{ 11 // //序列化 12 // bf.Serialize(stream, i); 13 //} 14 15 16 Person p1 = new Person(); 17 p1.Name = "老布什"; 18 p1.Age = 80; 19 p1.Id = 1; 20 21 Person p2 = new Person(); 22 p2.Name = "小布什"; 23 p2.Age = 50; 24 p2.Id = 2; 25 p2.Parent = p1; 26 27 Person1 = p2; 28 29 BinaryFormatter bf = new BinaryFormatter(); 30 using (Stream stream = File.OpenWrite(@"c:\i1.dat")) 31 { 32 //序列化 33 bf.Serialize(stream, p2); 34 } 35 } 36 37 private void button4_Click(object sender, EventArgs e) 38 { 39 //BinaryFormatter bf = new BinaryFormatter(); 40 //using (Stream stream = File.OpenRead(@"c:\i1.dat")) 41 //{ 42 // //反序列化。De:反。 43 // //compile→decompile 44 // //compress→decompress。 45 // //encrypt一decrpt??? 46 // object obj = bf.Deserialize(stream); 47 // int i = (int)obj; 48 // i++; 49 // MessageBox.Show(i.ToString()); 50 //} 51 52 BinaryFormatter bf = new BinaryFormatter(); 53 using (Stream stream = File.OpenRead(@"c:\i1.dat")) 54 { 55 //反序列化。De:反。 56 //compile→decompile 57 //compress→decompress。 58 //encrypt一decrpt??? 59 Person p = (Person)bf.Deserialize(stream); 60 61 Person2 = p; 62 MessageBox.Show(p.Parent.Name); 63 } 64 } 65 66 private void button5_Click(object sender, EventArgs e) 67 { 68 bool b = object.ReferenceEquals(Person1, Person2); 69 MessageBox.Show(b.ToString()); 70 } 71 } 72 73 [Serializable] 74 class Person 75 { 76 public int Id { get; set; } 77 public string Name { get; set; } 78 public int Age { get; set; } 79 public Person Parent { get; set; } 80 public Dog Pet { get; set; } 81 } 82 83 [Serializable] 84 class Dog 85 { 86 public string Name { get; set; } 87 }
ivate Person Person1;
private Person Person2;
private void button3_Click(object sender, EventArgs e)
{
//int i = DateTime.Now.Second;
//BinaryFormatter bf = new BinaryFormatter();
//using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
//{
// //序列化
// bf.Serialize(stream, i);
//}
Person p1 = new Person();
p1.Name = "老布什";
p1.Age = 80;
p1.Id = 1;
Person p2 = new Person();
p2.Name = "小布什";
p2.Age = 50;
p2.Id = 2;
p2.Parent = p1;
Person1 = p2;
BinaryFormatter bf = new BinaryFormatter();
using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
{
//序列化
bf.Serialize(stream, p2);
}
}
private void button4_Click(object sender, EventArgs e)
{
//BinaryFormatter bf = new BinaryFormatter();
//using (Stream stream = File.OpenRead(@"c:\i1.dat"))
//{
// //反序列化。De:反。
// //compile→decompile
// //compress→decompress。
// //encrypt一decrpt???
// object obj = bf.Deserialize(stream);
// int i = (int)obj;
// i++;
// MessageBox.Show(i.ToString());
//}
BinaryFormatter bf = new BinaryFormatter();
using (Stream stream = File.OpenRead(@"c:\i1.dat"))
{
//反序列化。De:反。
//compile→decompile
//compress→decompress。
//encrypt一decrpt???
Person p = (Person)bf.Deserialize(stream);
Person2 = p;
MessageBox.Show(p.Parent.Name);
}
}
private void button5_Click(object sender, EventArgs e)
{ //比较对象是否是一个对象(深拷贝)
bool b = object.ReferenceEquals(Person1, Person2);
MessageBox.Show(b.ToString());
}
}
[Serializable]
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Person Parent { get; set; }
public Dog Pet { get; set; }
}
[Serializable]
class Dog
{
public string Name { get; set; }
}
扩展阅读:(1)http://www.yaosansi.com/post/1061.html (2)http://blog.sina.com.cn/s/blog_645752e60100h4w9.html
对象序列化就是将对象写到流里面

浙公网安备 33010602011771号