1.序列化一般有2種(XML和2進制),簡單對象序列化
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Windows.Forms; using System.Xml.Serialization; namespace Test { //對於XmlSerializer序列化,默認即使不使用特性Serializable,也是可以對對象進行序列化的,則BinaryFormatter不然一定要使用Serializable標記。 public partial class Form1 : Form { //XmlSerializer是XML序列化 XmlSerializer xs = new XmlSerializer(typeof(Student)); //二進制序列化 BinaryFormatter b = new BinaryFormatter(); Student student = new Student() { Name = "小明", Age = 15 }; public Form1() { InitializeComponent(); //xml序列化 using (Stream stream = new FileStream("d:\\Student.xml", FileMode.Create, FileAccess.Write, FileShare.Read)) { xs.Serialize(stream, student); } //xml反序列化 using (FileStream fs = new FileStream("d:\\Student.xml", FileMode.Open, FileAccess.Read)) { Student student = (Student)xs.Deserialize(fs); } //二進制序序列化 using (FileStream fileStream = new FileStream("d:\\Student.dat", FileMode.Create)) { BinaryFormatter b = new BinaryFormatter(); //序列化類要加[Serializable]特性 b.Serialize(fileStream, student); } //二進制序反序列化 using (FileStream fileStream = new FileStream("d:\\Student.dat", FileMode.Open, FileAccess.Read)) { BinaryFormatter bf = new BinaryFormatter(); student = (Student)bf.Deserialize(fileStream); } } } } [Serializable] public class Student { public string Name { get; set; } public int Age { get; set; } }
2.復雜對象序列化
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Serialization; namespace Test { public partial class Form1 : Form { //XmlSerializer是XML序列化 XmlSerializer xs = new XmlSerializer(typeof(TeacherStudent)); //二進制序列化 BinaryFormatter b = new BinaryFormatter(); TeacherStudent teacherStudent = new TeacherStudent(); Teacher teacher = new Teacher() { Name = "王老師", Age = 45 }; Student student = new Student() { Name = "小明", Age = 15 }; public Form1() { InitializeComponent(); //xml序列化 using (Stream stream = new FileStream("d:\\Student.xml", FileMode.Create, FileAccess.Write, FileShare.Read)) { teacherStudent.Teacher = teacher; teacherStudent.Student = student; xs.Serialize(stream, teacherStudent); } //xml反序列化 using (FileStream fs = new FileStream("d:\\Student.xml", FileMode.Open, FileAccess.Read)) { teacherStudent = null; teacherStudent = (TeacherStudent)xs.Deserialize(fs); } //二進制序序列化 using (FileStream fileStream = new FileStream("d:\\Student.dat", FileMode.Create)) { BinaryFormatter b = new BinaryFormatter(); b.Serialize(fileStream, teacher); b.Serialize(fileStream, student); } //二進制序反序列化 using (FileStream fileStream = new FileStream("d:\\Student.dat", FileMode.Open, FileAccess.Read)) { teacher = null; student = null; BinaryFormatter bf = new BinaryFormatter(); teacher = (Teacher)bf.Deserialize(fileStream); student = (Student)bf.Deserialize(fileStream); } } } } [Serializable] public class Student { public string Name { get; set; } public int Age { get; set; } } [Serializable] public class Teacher { public string Name { get; set; } public int Age { get; set; } } [Serializable] public class TeacherStudent { public Teacher Teacher { get; set; } public Student Student { get; set; } }
3. 控制序列化/反序列化前后的數據
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Windows.Forms; namespace Test { public partial class Form1 : Form { //XmlSerializer是XML序列化 BinaryFormatter b = new BinaryFormatter(); Student student = new Student() { Name = "小明", Age = 15 }; public Form1() { InitializeComponent(); //二進制序序列化 using (FileStream fileStream = new FileStream("d:\\Student.dat", FileMode.Create)) { BinaryFormatter b = new BinaryFormatter(); b.Serialize(fileStream, student); } //二進制序反序列化 using (FileStream fileStream = new FileStream("d:\\Student.dat", FileMode.Open, FileAccess.Read)) { BinaryFormatter bf = new BinaryFormatter(); student = (Student)bf.Deserialize(fileStream); } } } } [Serializable] public class Student { public string Name { get; set; } public int Age { get; set; } [OnSerializing()] internal void OnSerializingMethod(StreamingContext context) { //格式化器在序列化開始之前調用此方法。 Console.WriteLine("OnSerializing格式化器在序列化開始之前調用此方法"); } [OnSerialized()] internal void OnSerializedMethod(StreamingContext context) { //格式化器在序列化后調用此方法。 Console.WriteLine("OnSerialized格式化器在序列化后調用此方法"); } [OnDeserializing()] internal void OnDeserializingMethod(StreamingContext context) { //格式化器在反序列化開始之前調用此方法。 Console.WriteLine("OnDeserializing格式化器在反序列化開始之前調用此方法"); } [OnDeserialized()] internal void OnDeserializedMethod(StreamingContext context) { //格式化器在序列化開始之前調用此方法。 Console.WriteLine("OnDeserialized格式化器在序列化開始之前調用此方法"); } }