对象序列化与反序列化
- 对象序列化是将对象(比如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; }
}
}