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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM