• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#序列化

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
使用C#调用外部Ping命令获取网络连接情况发布时间:2022-07-13
下一篇:
c#string中含有双引号处理模式发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap