C#上位机项目实战——参数持久化之MessagePack二进制序列化

前言

我们开发的上位机经常需要将一些参数保存到电脑本地,从而方便下次打开软件时把上一次保存到本地电脑的参数读取出来,本文就来讲解参数持久化之MessagePack二进制序列化来实现这个功能。

1、定义存储参数的类

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

2、对象赋值

  var person1= new Person();
            person1.Age = 10;
            person1.Name = "小王";

3、引用MessagePack库

在这里插入图片描述
我这里安装的是3.1.8版本
在这里插入图片描述

4、参数写入本地

  var options = MessagePackSerializerOptions.Standard.WithResolver(ContractlessStandardResolver.Instance);
            byte[] bytes = MessagePackSerializer.Serialize(person1, options);
            File.WriteAllBytes("settings.bin", bytes);

写入本地后会生成一个.bin的文件,如下图:
在这里插入图片描述

5、从本地读取参数

byte[] readBytes = File.ReadAllBytes("settings.bin");
        Person person2 = MessagePackSerializer.Deserialize<Person>(readBytes, options);
        Console.WriteLine(person2.Age );
        Console.WriteLine(person2.Name);

输出结果
在这里插入图片描述
能看出来输出的结果和保存到本地的结果是一致的。

6、抽象类序列化错误案例

public abstract  class AbstractPerson
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
   public  class Chinese: AbstractPerson
    {
        public string IdCard { get; set; }

    }
//对象赋值
    AbstractPerson abstractPerson = new Chinese ();
    abstractPerson.Age = 10;
    abstractPerson.Name = "小王";

    //参数写入本地
    var options = MessagePackSerializerOptions.Standard.WithResolver(ContractlessStandardResolver.Instance);
    byte[] bytes = MessagePackSerializer.Serialize(abstractPerson, options);
    File.WriteAllBytes("settings.bin", bytes);

抽象类序列化会报错
在这里插入图片描述

7、抽象类序列化正确案例

这里最重要的是将ContractlessStandardResolver.Instance改成了TypelessContractlessStandardResolver.Instance,这样就可以实现抽象类的序列化与反序列化。

public abstract  class AbstractPerson
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
   public  class Chinese: AbstractPerson
    {
        public string IdCard { get; set; }

    }
 //对象赋值
            Chinese person = new Chinese ();
            person.Age = 10;
            person.Name = "小王";
            person.IdCard = "123456";
            AbstractPerson abstractPerson = person;

            //参数写入本地
            var options = MessagePackSerializerOptions.Standard.WithResolver(TypelessContractlessStandardResolver.Instance);
            byte[] bytes = MessagePackSerializer.Serialize(abstractPerson, options);
            File.WriteAllBytes("settings.bin", bytes);


            //从本地读取参数到内存
            byte[] readBytes = File.ReadAllBytes("settings.bin");
            AbstractPerson person2 = MessagePackSerializer.Deserialize<AbstractPerson>(readBytes, options);
            Chinese chinese = (Chinese)person2;
            Console.WriteLine(chinese.Age);
            Console.WriteLine(chinese.Name);
            Console.WriteLine(chinese.IdCard );

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

以上教程CSDN订阅已超过2000+~

加入文章最下方qq群即可获取更多C#上位机资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上位机马工

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

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

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

打赏作者

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

抵扣说明:

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

余额充值