二进制数据的序列化反序列化和Json的序列化反序列化的重要区别
发布时间:2020-12-16 08:57:02 所属栏目:asp.Net 来源:网络整理
导读:前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: ? /// summary /// 反序列化对象 /summary typeparam name="T" 指定对象类型 /typeparam param name="data" 字节数组 /param param name="isClearData" 压缩完成后,是否清除待压
前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: ? /// <summary> /// 反序列化对象 </summary> <typeparam name="T">指定对象类型</typeparam> <param name="data">字节数组</param> <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容<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 = MemoryStream(data)) { t = (T)formatter.Deserialize(ms); } formatter = ; if (isClearData) Array.Clear(data,0,data.Length); } catch (Exception ex) { throw ex; } t; } [Serializable] class parent { string a; } [Serializable] children : parent { b; } 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 children; Console.WriteLine(JsonConvert.SerializeObject(c)); Console.Read(); ? 是不是很奇怪?? 妹的,真是神奇了,最后询问我们的老大才知道,划重点了哈: ? 重点:通过二级制流序列化和反序列化的对象呢,属性值并不会丢失!!! 而通过JsonConvert进行的string类型的序列化反序列化,多余的属性值会丢失!!!? ? ?就是真么神奇! 本人觉得,应该是和机制有关,通过二进制转换的数据,多余的数据计算机会始终记录着,毕竟计算机本身就是二进制的。而通过JsonConvert的方式,它会默认去匹配属性去,没有匹配上的属性会直接丢失。? ? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – Cookie不会被删除
- asp.net-mvc – 我可以在_Layout.cshtml中有条件地渲染部分
- 从ASP.NET Core Web API将多GB文件流式传输到AWS S3
- 自定义每个用户的会话超时 – ASP.NET
- asp.net – RequiredFieldValidator在文本上放置display:i
- asp.net – <%和<%之间有什么区别:
- 如何在iis8中启用asp.net
- Cannot attach the file *.mdf as database
- 如何更改asp.net identity 3(vnext)使用的表名?
- asp.net-mvc – 具有多个参数的ActionLink
推荐文章
站长推荐
- asp.net – 如何检测用户操作系统
- global-variables – MVC 3 Razor _ViewStart中的
- ASP.NET测量性能
- asp.net-mvc-3 – 创建MVC3剃刀助手,如Helper.Be
- wcf – OData是否违反了关注点?
- asp.net-mvc-3 – ASP.NET MVC 3中ModelState.Is
- asp.net – 32位池和64位池之间的内存使用情况
- asp.net-mvc – 使用ASP.NET MVC的RESTful Web服
- 为什么我的asp.net应用程序抛出ThreadAbortExcep
- asp.net-mvc – 具有MasterPage的视图上的多个An
热点阅读