二進制數據的序列化反序列化和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));

        }

  猜猜結果是什麼?spa

  

 

  很奇怪?是否是,我是先反序列化成的父對象:parent對象,parent對象裏沒有屬性b,可是我將父對象AS成子對象時,子對象children的屬性b中竟然有值,是否是很神奇!!!code

  一樣的狀況,咱們使用JsonConvert的序列化和反序列化作一遍,結果以下:orm

  

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類型的序列化反序列化,多餘的屬性值會丟失!!!     就是真麼神奇!blog

  本人以爲,應該是和機制有關,經過二進制轉換的數據,多餘的數據計算機會始終記錄着,畢竟計算機自己就是二進制的。而經過JsonConvert的方式,它會默認去匹配屬性去,沒有匹配上的屬性會直接丟失。   string

相關文章
相關標籤/搜索