欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

程序员文章站 2022-03-13 17:46:12
重点:通过二级制流序列化和反序列化的对象呢,属性值并不会丢失!!! 而通过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));

        }

  猜猜结果是什么?

  二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

 

  很奇怪?是不是,我是先反序列化成的父对象: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();

 二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

  是不是很奇怪?  妹的,真是神奇了,最后询问我们的老大才知道,划重点了哈:

 

  重点:通过二级制流序列化和反序列化的对象呢,属性值并不会丢失!!! 而通过jsonconvert进行的string类型的序列化反序列化,多余的属性值会丢失!!!     就是真么神奇!

  本人觉得,应该是和机制有关,通过二进制转换的数据,多余的数据计算机会始终记录着,毕竟计算机本身就是二进制的。而通过jsonconvert的方式,它会默认去匹配属性去,没有匹配上的属性会直接丢失。