zoukankan      html  css  js  c++  java
  • 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格式化器在序列化开始之前调用此方法");
        }
    }
  • 相关阅读:
    【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?
    你说你懂计算机网络,那这些你都知道吗
    程序员需要了解的硬核知识之控制硬件
    程序员需要了解的硬核知识之汇编语言(全)
    真的,Kafka 入门一篇文章就够了
    程序员需要了解的硬核知识之汇编语言(一)
    带你涨姿势的认识一下 Kafka 消费者
    程序员需要了解的硬核知识之操作系统和应用
    详解Kafka Producer
    程序员需要了解的硬核知识之操作系统入门
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/5860812.html
Copyright © 2011-2022 走看看