MessagePack for C#
快速序列化组件MessagePack介绍
简介
MessagePack for C#(MessagePack-CSharp)是用于C#的极速MessagePack序列化程序,比MsgPack-Cli快10倍,与其他所有C#序列化程序相比,具有最好的性能。 MessagePack for C#具有内置的LZ4压缩功能,可以实现超快速序列化和二进制占用空间小。 性能永远是重要的! 可用于游戏,分布式计算,微服务,数据存储到Redis等。支持.NET, .NET Core, Unity, Xamarin。
从上图我们看出MessagePack for C#在性能测试中是最好的,这里解释一下第三个MsgPack-Cli是MessagePack官方实现的。第一和第二都是MessagePack for C#,第一项相比第二项具有稍快一点的序列化和反序列化速度,但是第二项采用了L4压缩功能,显著的减少了二进制的大小。在实际使用中推荐使用L4压缩功能。
使用
该组件已经发布在Nuget,使用命令加入项目。
Install-Package MessagePack
分析器
Install-Package MessagePackAnalyzer
扩展
- Install-Package MessagePack.ImmutableCollection
- Install-Package MessagePack.ReactiveProperty
- Install-Package MessagePack.UnityShims
- Install-Package MessagePack.AspNetCoreMvcFormatter
Unity在此处下载 https://github.com/neuecc/MessagePack-CSharp/releases
快速开始
定义一个类添加[MessagePackObject]
特性,公共成员(属性或者字段)添加[Key]
特性,调用MessagePackSerializer.Serialize<T>/Deserialize<T>
进行序列化和反序列化,ToJson
可以帮我们转储二进制为json格式。
- // 标记 MessagePackObjectAttribute
- [MessagePackObject]
- public class MyClass { // Key 是序列化索引,对于版本控制非常重要。 [Key(0)] public int Age { get; set; } [Key(1)] public string FirstName { get; set; } [Key(2)] public string LastName { get; set; } // 公共成员中不序列化目标,标记IgnoreMemberAttribute [IgnoreMember] public string FullName { get { return FirstName + LastName; } } }
class Program { static void Main(string[] args) { var mc = new MyClass { Age = 99, FirstName = "hoge", LastName = "huga", }; // 序列化 var bytes = MessagePackSerializer.Serialize(mc); //反序列化 var mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes); // 你可以将msgpack二进制转储为可读的json。 // 在默认情况下,MeesagePack for C#减少了属性名称信息。 // [99,"hoge","huga"] var json = MessagePackSerializer.ToJson(bytes); Console.WriteLine(json); Console.ReadKey(); } }
序列化索引将会影响该信息在序列化数据中的位置
默认情况下特性是必须的,但是我们有方法进行改变,让它变为不是必须的,详情请看后面。
分析器
MessagePackAnalyzer
可以帮助我们定义对象. 如果不符合规则,那么特性, 程序集等可以被检测到,如果我们编译就会出现编译错误。
如果要允许特定类型(例如,注册自定义类型时),请将MessagePackAnalyzer.json放在项目根目录下,并将生成操作设置为AdditionalFiles
(其他文件)。
这是MessagePackAnalyzer.json内容的一个示例。
[ "MyNamespace.FooClass", "MyNameSpace.BarStruct" ]
内置的支持类型
这些类型可以默认序列化。
基元(int、string等等), Enum, Nullable<>, TimeSpan, DateTime, DateTimeOffset, Nil, Guid, Uri, Version, StringBuilder, BitArray, ArraySegment<>, BigInteger, Complext, Task, Array[], Array[,], Array[,,], Array[,,,], KeyValuePair<,>, Tuple<,...>, ValueTuple<,...>, List<>, LinkedList<>, Queue<>, Stack<>, HashSet<>, ReadOnlyCollection<>, IList<>, ICollection<>, IEnumerable<>, Dictionary<,>, IDictionary<,>, SortedDictionary<,>, SortedList<,>, ILookup<,>, IGrouping<,>, ObservableCollection<>, ReadOnlyOnservableCollection<>, IReadOnlyList<>, IReadOnlyCollection<>, ISet<>, ConcurrentBag<>, ConcurrentQueue<>, ConcurrentStack<>, ReadOnlyDictionary<,>, IReadOnlyDictionary<,>, ConcurrentDictionary<,>, Lazy<>, Task<>, 自定义继承ICollection <>或IDictionary <,>具有无参构造方法, IList,IDictionary和自定义继承ICollection或IDictionary具有无参构造函数(包括ArrayList和Hashtable)。
您可以添加自定义类型的支持和一些官方/第三方扩展包。 对于ImmutableCollections(ImmutableList <>等),对于ReactiveProperty和Unity(Vector3, Quaternion等等),对于F#(Record,FsList,Discriminated Unions等)。
MessagePack.Nil
是MessagePack for C#的内置null/void/unit表示类型。
对象序列化
MessagePack for C#可以序列化public Class或Struct,序列化目标必须标记[MessagePackObject]和[Key], Key类型可以选择int或字符串。如果Key类型是int,则使用序列化格式为数组,如果Key类型是字符串,则使用序列化格式为键值对,如果您定义了[MessagePackObject(keyAsPropertyName:true)],则不需要Key特性。
- [MessagePackObject]
- public class Sample1 { [Key(0)] public int Foo { get; set; } [Key(1)] public int Bar { get; set; } } [MessagePackObject] public class Sample2 { [Key(