加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

发布时间:2020-12-16 08:57:02 所属栏目:asp.Net 来源:网络整理
导读:前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: ? /// summary /// 反序列化对象 /summary typeparam name="T" 指定对象类型 /typeparam param name="data" 字节数组 /param param name="isClearData" 压缩完成后,是否清除待压

  前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码:

?

 /// <summary>
        /// 反序列化对象
        </summary>
        <typeparam name="T">指定对象类型</typeparam>
        <param name="data">字节数组</param>
        <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容<returns>指定类型的对象</returns>
        public static T DeserializeByBytes<T>(byte[] data,bool isClearData = true)
        {
            T t = default(T);
            if (data == null)
                return t;
            try
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream ms =  MemoryStream(data))
                {
                    t = (T)formatter.Deserialize(ms);
                }
                formatter = ;
                if (isClearData)
                    Array.Clear(data,0,data.Length);
            }
            catch (Exception ex)
            {
                throw ex;
            }
             t;
        }

        [Serializable]
        class parent
        {
            string a;

        }
        [Serializable]
         children : parent
        {
             b;
        }

        static DeserializeBytes(byte[] byteData)
        {
            //byteData数据,其实是:{ a = "1",b = "2" } 也就是children对象得到的二进制数据流

            parent a = Program.DeserializeByBytes<parent>(byteData);

            children b = a as children;

            Console.WriteLine(JsonConvert.SerializeObject(b));

        }

  猜猜结果是什么?

  

?

  很奇怪?是不是,我是先反序列化成的父对象:parent对象,parent对象里没有属性b,但是我将父对象AS成子对象时,子对象children的属性b中居然有值,是不是很神奇!!!

  同样的情况,我们使用JsonConvert的序列化和反序列化做一遍,结果如下:

  

var cc = new children { a = "1",b = 2" };

            var ccStr = JsonConvert.SerializeObject(cc);

            parent p = JsonConvert.DeserializeObject<parent>(ccStr);
            Console.WriteLine(JsonConvert.SerializeObject(p));
            children c = p  children;
            Console.WriteLine(JsonConvert.SerializeObject(c));

            Console.Read();

?

  是不是很奇怪?? 妹的,真是神奇了,最后询问我们的老大才知道,划重点了哈:

?

  重点:通过二级制流序列化和反序列化的对象呢,属性值并不会丢失!!! 而通过JsonConvert进行的string类型的序列化反序列化,多余的属性值会丢失!!!? ? ?就是真么神奇!

  本人觉得,应该是和机制有关,通过二进制转换的数据,多余的数据计算机会始终记录着,毕竟计算机本身就是二进制的。而通过JsonConvert的方式,它会默认去匹配属性去,没有匹配上的属性会直接丢失。? ?

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读