2025-11-01
C#
00

目录

中使用 MessagePack,包括安装、基本用法和性能优化。
安装
快速入门
定义可序列化的类
序列化和反序列化
使用记录类型
性能优化
示例:使用索引键
示例:用户信息的序列化与反序列化
定义用户类
序列化用户对象
反序列化用户对象
结论

MessagePack 是一种高效的二进制序列化格式,特别适合于 C# 开发。与 JSON 和其他序列化格式相比,MessagePack 提供了更快的序列化和反序列化速度,适用于游戏、分布式计算和微服务等应用场景。本文将详细介绍如何在 C# 中使用 MessagePack,包括安装、基本用法和性能优化。

安装

MessagePack 可以通过 NuGet 安装。打开你的项目,使用以下命令安装 MessagePack 包:

Bash
Install-Package MessagePack

image.png

快速入门

定义可序列化的类

要使用 MessagePack 序列化自定义类型,首先需要定义一个类,并使用 [MessagePackObject] 属性标记它。类的属性需要使用 [Key] 属性标记,以指定序列化时的键。

C#
using MessagePack; [MessagePackObject] public class Sample { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } }

序列化和反序列化

使用 MessagePackSerializer 类可以轻松地序列化和反序列化对象。

C#
using MessagePack; namespace AppMessagePack { [MessagePackObject] public class Sample { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } } internal class Program { public static void Main() { // 创建一个 Sample 对象 var sample = new Sample { Id = 1, Name = "Test" }; // 序列化对象 byte[] serializedData = MessagePackSerializer.Serialize(sample); // 反序列化对象 Sample deserializedSample = MessagePackSerializer.Deserialize<Sample>(serializedData); // 输出反序列化后的对象 Console.WriteLine($"Id: {deserializedSample.Id}, Name: {deserializedSample.Name}"); Console.ReadKey(); } } }

image.png

使用记录类型

C# 9 引入了记录类型,支持更简洁的语法来定义不可变对象。MessagePack 也支持序列化记录类型。

C#
using MessagePack; [MessagePackObject(true)] public record Point(int X, int Y); public class Program { public static void Main() { // 创建一个 Point 记录 var point = new Point(10, 20); // 序列化记录 byte[] serializedData = MessagePackSerializer.Serialize(point); // 反序列化记录 Point deserializedPoint = MessagePackSerializer.Deserialize<Point>(serializedData); // 输出反序列化后的记录 Console.WriteLine($"X: {deserializedPoint.X}, Y: {deserializedPoint.Y}"); } }

image.png

性能优化

为了获得最佳性能,以下是一些建议:

  1. 使用索引键:如果可能,使用索引键而不是字符串键进行序列化,这样可以提高性能和减少二进制大小。
  2. 避免不必要的实例化:在序列化和反序列化过程中,尽量避免创建中间实例,以减少内存开销。
  3. 使用 AOT 生成:在不支持 JIT 的平台上,使用 AOT(提前编译)生成可以提高性能。
  4. 使用内存池:MessagePack 使用内存池来减少分配,从而降低 GC 压力。

示例:使用索引键

C#
using MessagePack; namespace AppMessagePack { [MessagePackObject(keyAsPropertyName: true)] public class SampleWithIndex { public int Id { get; set; } public string Name { get; set; } } public class Program { public static void Main() { var sample = new SampleWithIndex { Id = 1, Name = "Optimized" }; byte[] serializedData = MessagePackSerializer.Serialize(sample); SampleWithIndex deserializedSample = MessagePackSerializer.Deserialize<SampleWithIndex>(serializedData); Console.WriteLine($"Id: {deserializedSample.Id}, Name: {deserializedSample.Name}"); } } }

示例:用户信息的序列化与反序列化

定义用户类

首先,我们定义一个 User 类,包含用户的基本信息,如 ID、姓名和年龄。我们将使用 MessagePack 的特性来标记可序列化的类和属性。

C#
using MessagePack; [MessagePackObject] public class User { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } [Key(2)] public int Age { get; set; } }

序列化用户对象

接下来,我们将创建一个 User 对象,并使用 MessagePackSerializer 将其序列化为字节数组。

C#
using MessagePack; namespace AppMessagePack { [MessagePackObject] public class User { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } [Key(2)] public int Age { get; set; } } public class Program { public static void Main() { // 创建一个 User 对象 User user = new User { Id = 1, Name = "张三", Age = 30 }; // 序列化 User 对象 byte[] serializedData = MessagePackSerializer.Serialize(user); // 输出序列化后的字节数组 Console.WriteLine("序列化后的数据: " + BitConverter.ToString(serializedData)); } } }

image.png

反序列化用户对象

现在,我们将使用序列化得到的字节数组来反序列化为 User 对象,并输出其属性值。

C#
using System; using MessagePack; public class Program { public static void Main(string[] args) { // 创建一个 User 对象 User user = new User { Id = 1, Name = "张三", Age = 30 }; // 序列化 User 对象 byte[] serializedData = MessagePackSerializer.Serialize(user); Console.WriteLine("序列化后的数据: " + BitConverter.ToString(serializedData)); // 反序列化 User 对象 User deserializedUser = MessagePackSerializer.Deserialize<User>(serializedData); // 输出反序列化后的对象属性 Console.WriteLine($"反序列化后的用户信息: ID = {deserializedUser.Id}, Name = {deserializedUser.Name}, Age = {deserializedUser.Age}"); } }

image.png

结论

MessagePack 是一个强大的序列化工具,适用于需要高性能和低内存开销的应用程序。通过使用简单的属性标记和高效的序列化方法,开发者可以轻松地在 C# 中实现数据的快速传输。希望本文能帮助你更好地理解和使用 MessagePack。如果你有任何问题或需要进一步的帮助,请随时询问!

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!