C# messagePack对类(class)序列化简单示例

c# messagepack对类(class)序列化的简单示例

0 引言

  MessagePack是一种高效的二进制序列化格式,它可以在C#中用于序列化和反序列化对象。与其他序列化格式相比,如JSON和XML,MessagePack的编码和解码速度更快,生成的二进制数据更小。

  C#中使用MessagePack进行序列化和反序列化非常简单。可以使用NuGet包管理器安装MessagePack库到工程项目中,安装最新版本即可。安装后可以通过下面命令,对需要的类/数据进行序列化,得到序列化后的字节数组。

byte[] bin = MessagePackSerializer.Serialize(input);

  然后,可通过下面命令将字节数组再反序列化回对应的类/数据;

<T> res = MessagePackSerializer.Deserialize<T>(bin);

1 示例

   下面是使用messagePack进行序列化和反序列化的一个示例:

// 定义一个静态方法输入一个需要进行序列化的类,反序列化输出一个类
using MessagePack;
using static WindowsFormsApp1.@interface;
using KeyAttribute = MessagePack.KeyAttribute;

namespace WindowsFormsApp1
{

	// 定义进行序列化的类
    [MessagePackObject]
    public class test1_method
    {
        [Key(0)]
        public string Name { get; set; }

        [Key(1)]
        public int Age { get; set; }

        [Key(2)]
        public double[] HomeAddress { get; set; }
    }
    [MessagePackObject]
    public class test1_method_out
    {
        [Key(1)]
        public double[] HomeAddress { get; set; }
    }


    class @interface
    {

        /// <summary>
        /// 序列/反序列接口调用
        /// </summary>
        public static void Process<tinput,tresult>(tinput input, out tresult res)
        {
            byte[] bin = MessagePackSerializer.Serialize(input); // 序列化
            res = MessagePackSerializer.Deserialize<tresult>(bin); // 反序列化
        }
        
    }
}
// 测试messagepack是否可以正确调用
        public Form1()
        {
            test1_method aa = new test1_method
            {
                Name = "nihao",
                Age = 14,
                HomeAddress = new double[5] { 1, 2, 3, 4, 5 }
            };
            test1_method bb;
            Process(aa, out bb); // 序列化和反序列化执行函数
            InitializeComponent();
        }

执行后结果:

  执行之后能够看到,aa类经过序列化/反序列化后得到的bb类,bb类中的属性值与aa一致,说明序列化/反序列化实现了对类的可逆操作,这可以方便应用到制作API接口上。


2 纠错

   在初次使用messagePack时遇到了下面错误,会造成的序列化失败,错误信息大概为下面内容。

“TypeLoadException: 程序集“MessagePack.Resolvers.DynamicObjectResolver, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”的类型“MessagePack.Formatters.WindowsFormsApp1_interface+class”尝试实现不可访问的接口。”:


  经过多种尝试,发现将要进行序列化的类挪到命名空间下,再执行序列化就不会出错了。

	// 定义进行序列化的类(这样定义上面错误不会出现)
namespace WindowsFormsApp1
{
    [MessagePackObject]
    public class test1_method
    {
        [Key(0)]
        public string Name { get; set; }

        [Key(1)]
        public int Age { get; set; }

        [Key(2)]
        public double[] HomeAddress { get; set; }
    }
 。。。。。
}
	// 定义进行序列化的类(这样定义在进行序列化的时候就会出错)
namespace WindowsFormsApp1
{
  class @interface    // 。。。。。。
    {
    
    [MessagePackObject]
    public class test1_method
    {
        [Key(0)]
        public string Name { get; set; }

        [Key(1)]
        public int Age { get; set; }

        [Key(2)]
        public double[] HomeAddress { get; set; }
    }
    
 。。。。。
   }
}

3 结语

   本篇简单介绍了在c#下使用messagepack序列化/反序列化的方法,提供了运行示例,记录了初次使用messagepack时遇到的错误,及解决办法。






😜
😜😜
😜😜😜😜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咋(za)说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值