二进制数据的序列化反序列化和Json的序列化反序列化的重要区别
程序员文章站
2022-06-18 09:55:38
重点:通过二级制流序列化和反序列化的对象呢,属性值并不会丢失!!! 而通过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的方式,它会默认去匹配属性去,没有匹配上的属性会直接丢失。
下一篇: c#自定义Attribute获取接口实现
推荐阅读
-
c#数据的序列化和反序列化(推荐版)
-
Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全
-
C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比
-
PHP的serialize序列化数据以及JSON格式化数据分析
-
JS对象序列化成json数据和json数据转化为JS对象的代码
-
golang:json 反序列化的[]和nil操作
-
jQuery序列化form表单数据为JSON对象的实现方法
-
JS实现json的序列化和反序列化功能示例
-
解析网站处理数据交换时的序列化和反序列化
-
.net core Json字符串的序列化和反序列化通用类源码,Newtonsoft和DataContractJsonSerializer性能对比