- 对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
- BinaryFormatter类有两个方法:
– void Serialize(Stream stream, object graph)对象graph序列化到stream中
– object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象
- 不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。
- 反序列的项目中必须有同样的类,否则不能反序列化。
using System;
using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.Serialization.Formatters.Binary;using System.IO;namespace 序列化反序列化
{ public partial class Form1 : Form { public Form1() { InitializeComponent(); }private void btnSerialize_Click(object sender, EventArgs e)
{ List<string> list = new List<string>(); list.Add("美国与中国"); list.Add("历代经济变革得失"); list.Add("抉择时刻"); BinaryFormatter bf = new BinaryFormatter(); using (Stream stream = File.OpenWrite(@"C:\Users\LeiXin\Desktop\1.dat")) { //序列化 bf.Serialize(stream, list); } MessageBox.Show("序列化成功"); }private void btnDeserialize_Click(object sender, EventArgs e)
{ BinaryFormatter bf = new BinaryFormatter(); using (Stream stream = File.OpenRead(@"C:\Users\LeiXin\Desktop\1.dat")) { //反序列化 object obj = bf.Deserialize(stream); List<string> lists = (List<string>)obj; foreach (var list in lists) { MessageBox.Show(list); } } }private void btnObjectSerialize_Click(object sender, EventArgs e)
{ 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:\Users\LeiXin\Desktop\i1.dat")) { bf.Serialize(stream, p2); MessageBox.Show("对象序列化成功!"); } }private void btnObjectDeseralize_Click(object sender, EventArgs e)
{ BinaryFormatter bf = new BinaryFormatter(); using (Stream stream = File.OpenRead(@"C:\Users\LeiXin\Desktop\i1.dat")) { Person p=(Person)bf.Deserialize(stream); MessageBox.Show(p.Parent.Name); } } } [Serializable]//要序列化,必须在该类的前面标记[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]//不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。class Dog
{ public string Name { get; set; } }}