zoukankan      html  css  js  c++  java
  • 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个很像,但是真不是同一个。

  • 相关阅读:
    python核心编程学习记录之基础知识
    VC++6.0出现no compile tool is associated with the extension.解决方法
    内存记号(Memory Trail)[自定义的名字] --调试方法
    Console 窗口
    C++ Builder创建和调用dll中的资源
    C++ builder 书籍推荐
    Qt书籍推荐
    消息队列数据结构
    Qt工程文件说明
    .obj : error LNK2001: unresolved external symbol "public: static unsigned long __stdcall ReadWrite::readData(void *)" (?readData@ReadWrite@@SGKPAX@Z)
  • 原文地址:https://www.cnblogs.com/jinyu20180311/p/9788565.html
Copyright © 2011-2022 走看看