前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码:数组
/// <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