重點:通過二級制流序列化和反序列化的對象呢,屬性值並不會丟失!!! 而通過JsonConvert進行的string類型的序列化反序列化,多餘的屬性值會丟失!!! 就是真麽神奇! ...
前言:最近一個一個很奇怪的問題,很明白的說,就是沒看懂,參照下麵的代碼:
/// <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的方式,它會預設去匹配屬性去,沒有匹配上的屬性會直接丟失。