c#的二进制序列化组件MessagePack介绍

c#的序列化有多种,我一般喜欢用第三方组件,一个公共组件要拿出来用,而且支持很多语言,甚至以此谋生,肯定有其优势。

有或者说存在必然有其合理性,经过几年开发,我更加喜欢第三方的东西,类似序列化的东西。

开篇总是牢骚,大家要习惯哈

最近在写一个小组件,组合一个框架,先分别介绍里面用到的东西,恰好一个个说说。

本篇就叫序列化篇吧,没有什么多说的,直接代码上了。

已经测试了,没有什么多说的。

里面有个init方法,因为我的类是静态的,所以每个都调用一次初始化。

/// 序列化二进制

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="obj"></param>

/// <returns></returns>

public static byte[] Serializer<T>(T obj)

{

Init();

return MessagePackSerializer.Serialize<T>(obj);

}

/// <summary>

/// 反序列化二进制

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="bytes"></param>

/// <returns></returns>

public static T Deserialize<T>(byte[] bytes)

{

Init();

return MessagePackSerializer.Deserialize<T>(bytes);

}

/// <summary>

/// byte[]转json字符串

/// </summary>

/// <param name="json"></param>

/// <returns></returns>

public static string JSONBytesToString(byte[]json)

{

Init();

return MessagePackSerializer.ToJson(json);

}

/// <summary>

/// json字符串转byte[]

/// </summary>

/// <param name="json"></param>

/// <returns></returns>

public static byte[] JSONStringToBytes(string json)

{

Init();

return MessagePackSerializer.FromJson(json);

}

/// <summary>

/// 对象转json字符串

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="obj"></param>

/// <returns></returns>

public static string JSONObjectToString<T>(T obj)

{

return MessagePackSerializer.ToJson<T>(obj);

}

/// <summary>

/// 对象直接转json的byte[]

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="obj"></param>

/// <returns></returns>

public static byte[] JSONObjectToBytes<T>(T obj )

{

Init();

return JSONStringToBytes(JSONObjectToString<T>(obj));

}

/// <summary>

/// json字符串转对象,序列化

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="json"></param>

/// <returns></returns>

public static T JSONStringToObject<T>(string json)

{

Init();

return Deserialize<T>(JSONStringToBytes(json));

}

后说:

MessagePack中也有JSON,所以一并用了,谁叫fastjson只有java版本呢。

MessagePack有2种使用方式,一直是特性,需要在序列化的类上添加MessagePackObject,这叫做限制类扩展使用

例如:

[MessagePackObject]

public Class Person

另外一种就是非限制的,就是我使用的方式,封装一个方法,不使用特性,但是这种就需要初始化了,采用默认的实例。

也就有了我的初始化方法Init.就像下面这样。

private static volatile bool isInit=true;

private static void Init()

{

if (isInit)

{

MessagePackSerializer.SetDefaultResolver(MessagePack.Resolvers.ContractlessStandardResolver.Instance);

isInit = false;

}

}

MessagePack支持.Net 各类型平台,.Net Core,.Net FramWork,.Net Standard.

最最后说一下,mongdb有个东西叫BSON,这也是一种格式,也可以作为通信格式序列化。

mongdb的BSON格式也支持.Net各类型平台了。

总体来说,c#的序列化有XML,二进制,JSON,BSON

特别说明,这里介绍的MessagePack不是 MsgPack.Cli

MsgPack.Cli的官网是https://msgpack.org/,github:https://github.com/msgpack/msgpack-cli

而这里介绍的MessagePack没有官网,只有github:https://github.com/neuecc/MessagePack-CSharp

虽然2个很像,但是真不是同一个。