在我们项目开发中,序列化是经常使用JSON格式,但对于一些对性能、存储有要高要求的系统,我们就会考虑二进制形式。
下面推荐一个二进制序列化格式的开源库,以满足低存储的需求。
01 项目简介
MessagePack-CSharp是一个兼容各个平台(包括 .NET、.NET Core、Unity 和 Xamarin)的非常快速的消息包序列化器。支持了高效的方法来序列化和反序列化数据,特别适合于游戏、分布式计算、微服务或数据缓存等对性能要求较高的应用程序。
该项目有如下特点:
1、性能: MessagePack for C# 序列化器的速度是 MsgPack-Cli 的 10 倍,并且在性能上超越了其他 C# 序列化器。
2、紧凑的二进制格式: 采用二进制格式,相对比JSON、XML等格式,更加紧凑和高效。
3、LZ4 压缩支持: 内置了对 LZ4 压缩算法的支持,这是一种极其快速的压缩算法。
4、丰富的 API: 提供了高级 API(MessagePackSerializer)、低级 API(IMessagePackFormatter)和原始 API(MessagePackWriter、MessagePackReader)。
5、类型安全和灵活性: 支持对象序列化,包括 DataContract 兼容性、只读/不可变对象成员序列化、联合类型等。
6、安全性: 提供了对反序列化时安全性的考虑,可以配置安全选项以降低执行任意代码或拒绝服务攻击的风险。
7、扩展性: 支持通过扩展包来扩展序列化支持,例如 ReactiveProperty、Unity 特定类型等。
8、Unity 和 Xamarin 的 AOT 代码生成支持: 针对 Unity 和 Xamarin 等平台提供了 AOT(Ahead Of Time)编译支持。
9、平台支持: 支持 .NET Standard 2.0,并对 .NET Core 2.1+ 进行了特别优化,兼容大多数较新的 .NET 运行时环境。
02 使用方法
1、安装依赖库
Install-Package MessagePack
2、定义要被序列化的类
使用 [MessagePackObject] 属性对其进行标注。类成员使用 [Key] 属性标注,以指定序列化时使用的键。
[MessagePackObject]
public class MyClass
{
[Key(0)]
public int Age { get; set; }
[Key(1)]
public string FirstName { get; set; }
[Key(2)]
public string LastName { get; set; }
// 所有不需要序列化的字段或属性应该使用 [IgnoreMember] 属性标注
[IgnoreMember]
public string FullName => FirstName + LastName;
}
3、使用 MessagePackSerializer 类来序列化和反序列化对象实例
using MessagePack;
// 创建 MyClass 的实例并设置属性
var mc = new MyClass
{
Age = 99,
FirstName = "hoge",
LastName = "huga",
};
// 序列化对象到 byte 数组
byte[] bytes = MessagePackSerializer.Serialize(mc);
// 反序列化 byte 数组回 MyClass 对象
MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes);
// 将 MessagePack 二进制 blob 转换为人类可读的 JSON 表示形式
// 使用索引键(与字符串键相对)将序列化为 MessagePack 数组,
// 因此属性名称不可用。[99,"hoge","huga"]
var json = MessagePackSerializer.ConvertToJson(bytes);
Console.WriteLine(json);
03 项目地址
https://github.com/MessagePack-CSharp/MessagePack-CSharp
- End -
推荐阅读
openai-dotnet:OpenAI官方提供的.NET SDK库!
dotnet-starter-kit:一个Web API+Blazor多租户、模块化、简洁DDD架构!