C#序列化

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格式化器在序列化开始之前调用此方法");
    }
}