zoukankan      html  css  js  c++  java
  • 二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

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

     /// <summary>
            /// 反序列化对象
            /// </summary>
            /// <typeparam name="T">指定对象类型</typeparam>
            /// <param name="data">字节数组</param>
            /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param>
            /// <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 = new MemoryStream(data))
                    {
                        t = (T)formatter.Deserialize(ms);
                    }
                    formatter = null;
                    if (isClearData)
                        Array.Clear(data, 0, data.Length);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return t;
            }
    
            [Serializable]
            public class parent
            {
                public string a;
    
            }
            [Serializable]
            public class children : parent
            {
                public string b;
            }
    
            public 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 as children;
                Console.WriteLine(JsonConvert.SerializeObject(c));
    
                Console.Read();

     

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

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

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

  • 相关阅读:
    dp
    数学分析 + 容斥原理
    容斥
    并查集
    矩阵hash + KMP
    扫描线
    位运算
    2015 Multi-University Training Contest 5 1009 MZL's Border
    iOS ZipArchive文件解压缩
    iOS GCD倒计时
  • 原文地址:https://www.cnblogs.com/lxhbky/p/10729162.html
Copyright © 2011-2022 走看看