前言
我们开发的上位机经常需要将一些参数保存到电脑本地,从而方便下次打开软件时把上一次保存到本地电脑的参数读取出来,本文就来讲解参数持久化之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#上位机资料

365

被折叠的 条评论
为什么被折叠?



