前言:最近一個一個很奇怪的問題,很明白的說,就是沒看懂,參照下面的代碼:數組
/// <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