序列化与反序列化

前言:

在计算机一级项目中,有个微信推送的功能,这个功能涉及到序列化与反序列化,这个问题可谓是让我想了一个项目的时间,可能是因为微信推送不太了解,现在重新学习一下,总结一下

概念:

序列化

将对象(如Person对象)转换为二进制数据(字节流)
其实最终存储在了文件中,文件是一种流的源头(后备存储),文件流就是流向文件的通道(介质)

反序列化

将二进制数据还原为对象
从文件中通过二进制流,将对象还原出来

序列化与数据库存储区别

在于应用场景不同,数据库存储是为了对象持久化,将对象存储在数据库文件中。而序列化按照特定格式将对象存储在文件中,保证了对象持久化之后,更侧重于网络传输,比如json文件。

具体操作:

序列化为txt(其他后缀文件也可以)

1.要序列化的Student类
    [Serializable]//标识为可序列化
    class Student
    {
        private string name;
        public string Name {
            get { return name; }
            set { name = value; }
        }

        private int age;
        public int Age {
            get { return age; }
            set { age = value; }
        }
    }
2.引入命名空间
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
3.序列化代码

序列化student对象到student.txt文件中

    static void Main(string[] args)
    {
        Student s = new Student() { Name = "zxg", Age = 18 };
            
        //创建流
        using (FileStream fs =File.Create("student.txt"))
        {
            BinaryFormatter bf = new BinaryFormatter();

            //序列化student对象
            bf.Serialize(fs, s);
        }
        Console.Read();
    }
4.验证结果

在该程序的Debug中创建一个student.txt文件
在这里插入图片描述

5.反序列化

将student对象从student.txt文件中还原出来

static void Main(string[] args)
{
    //文件流打开文件
    using (FileStream fs = File.OpenRead("student.txt"))
    {
        BinaryFormatter bf = new BinaryFormatter();

        //反序列化对象
        Student stu = (Student)bf.Deserialize(fs);
        //输出对象名字
        Console.WriteLine(stu.Name);
    }
    Console.Read();
}
6.显示结果:

在这里插入图片描述

序列化为json文件

1.要序列化的Student类

这次加入了一个Show方法,在反序列化为对象时调用,验证反序列化成功

    [DataContract]//要标识
    public class Student
    {
        [DataMember(Name ="Name")]//要标识
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        [DataMember(Name ="Age")]//要标识
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        public void Show()
        {
            Console.WriteLine("我的名字是{0}",Name);
        }

    }
2.引入命名空间

在Student类中引入

using System.Runtime.Serialization;

在序列化类(自定义一个类,下面会有)中引入

using System.Runtime.Serialization.Json;
using System.IO;
3.定义一个序列化类
  • WriteObject方法将对象转换成json
  • ReadObject方法将json转换成对象
    public class EndSerialize
    {
        //序列化
        public string Serializel(Student stu)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Student));
            MemoryStream ms = new MemoryStream();
            
            //WriteObject方法将对象转换成json
            ser.WriteObject(ms, stu);
            string jsonStr = Encoding.UTF8.GetString(ms.ToArray());
            return jsonStr;
        }
        //反序列化
        public Student Deserialize(string jsonStr)
        {
            
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Student));
            byte[] byteData = UTF8Encoding.UTF8.GetBytes(jsonStr);
            MemoryStream ms1 = new MemoryStream(byteData);

            //ReadObject方法将json转换成对象
            Student stu = (Student)ser.ReadObject(ms1);
            return stu;
        }
    }
4.外部调用
static void Main(string[] args)
{
    Student s = new Student() { Name = "zxg", Age = 18 };
    EndSerialize ser = new EndSerialize();
    //序列化Student对象为json字符串
    string stuStr=  ser.Serializel(s);
    Console.WriteLine(stuStr);

    //从json字符串中提取对象
    Student s1= ser.Deserialize(stuStr);
    //对象调用自身方法
    s1.Show();
    Console.Read();
}
5.验证结果:

在这里插入图片描述

总结:

序列化与文件流相关,序列化对象后通过流存储到文件中
反序列化打开文件形成流,还原成对象

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿成长轨迹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值