网站链接: 我爱捣鼓
当前位置: 首页 > web开发  > Asp.net/C#

c#中使用json.net进行数据的序列化及反序列化

2021/4/3 21:36:39

我们在进行程序开发中经常会用到序列化和反序列化,那什么是序列化和反序列化?序列化和反序列化到底有什么作用呢?下面我们就来说说:什么是序列化和反序列化(1)C#序列化是指把C#对象转换为字节序列的过程,而C#反序列化是指把字节序列恢复为C#对象的过程;(2)**序列…

我们在进行程序开发中经常会用到序列化和反序列化,那什么是序列化和反序列化?序列化和反序列化到底有什么作用呢?下面我们就来说说:

  • 什么是序列化和反序列化

(1)C#序列化是指把C#对象转换为字节序列的过程,而C#反序列化是指把字节序列恢复为C#对象的过程;

(2)**序列化:**对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了C#对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

(3)**反序列化:**客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

(4)本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。

  • 为什么需要序列化与反序列化

我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。

那么当两个C#进程进行通信时,能否实现进程间的对象传送呢?答案是可以的!如何做到呢?这就需要C#序列化与反序列化了!

换句话说,一方面,发送方需要把这个C#对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出C#对象。

当我们明晰了为什么需要C#序列化和反序列化后,我们很自然地会想C#序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

总的来说可以归结为以下几点:

(1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中;

(2)通过序列化以字节流的形式使对象在网络中进行传递和接收;

(3)通过序列化在进程间传递对象;

序列化和反序列化在C#开发中的实际应用

        今天项目中用到了数据的序列化反序列化,数据用的是EF自动生成的代码开始用的.net 自带的DataContractJsonSerializer进行序列化和反序列化,当代码写完以后,调试,实体因为有[DataContractAttribute(IsReference=true )] 这样一个属性,提示不能序列化,当然手改一下啦,改完以后,提示基类EntityObject 的这个属性不可以 。

        后来也是因为DataContractJsonSerializer 反序列化成集合的时候不好使,所以才下定决心废弃。采用了第三方的东西:传说中的Json.net 

        今天我也是要说这个组件序列化和反序列化的功能: 

        这里主要是作为提供数据的使用

        public class wf_Task_Inbox 
        { 
            public wf_Task_Inbox(string id,string name) 
            { 
                this.ID = id; 
                this.Name = name; 
            }
            [DataMember ] 
            public string ID { get; set; } 
            [DataMember] 
            public string Name{get ;set ;} 
        }


        一、序列化

        接下来是序列化的代码,为了对比清楚,先奉上.net 自带的方法: 

        /// <summary> 
        /// 把一个对象转化为json格式数据 
        /// </summary> 
        /// <param name="entity"></param> 
        /// <returns></returns> 
        public string EntityToJson(wf_Task_Inbox entity) 
        { 
            DataContractJsonSerializer serializer = newDataContractJsonSerializer(entity.GetType()); 
            using (MemoryStream stream = new MemoryStream()) 
            { 
                serializer.WriteObject(stream, entity); 
                return Encoding.UTF8.GetString(stream .ToArray ()); 
            } 
        }


        返回的是个字符串,集合序列化的方法类似; 

        下边是json.net的代码: 

        JsonConvert .SerializeObject (list, Formatting.None ); 

        有且只有一行!!!!当然首先得添加json.net的引用 

        二、反序列化

        接下是反序列化的代码,.net 自带: 

        /// <summary> 
        /// 将json 数据转化为对象 
        /// </summary> 
        /// <param name="entity"></param> 
        /// <param name="jsonstring"></param> 
        /// <returns></returns> 
        public wf_Task_Inbox JsonToEntity(string jsonstring) 
        { 
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(wf_Task_Inbox)); 
            using (MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonstring))) 
            { 
                return serializer.ReadObject(mStream) as wf_Task_Inbox; 
            } 
        }


        同时也是因为自带的木有泛型的扩展,所以不太喜欢。

        json.net的方法: 

        JsonConvert.DeserializeObject<List<wf_Task_Inbox>>(jsonstring) ;

        这个是集合的,当然单个对象的怎么弄,你懂的,去掉《T》 就行了呗.... 

        生成的序列化数据是标准的json格式: 

        [{"ID":"0","Name":"姓名:0"},{"ID":"1","Name":"姓名:1"},{"ID":"2","Name":"姓名:2"},{"ID":"3","Name":"姓名:3"},{"ID":"4","Name":"姓名:4"},{"ID":"5","Name":"姓名:5"},{"ID":"6","Name":"姓名:6"},{"ID":"7","Name":"姓名:7"},{"ID":"8","Name":"姓名:8"},{"ID":"9","Name":"姓名:9"}] 

这篇文章看完大家是否对序列化和反序列化有了更深的认识,如果您有别的更好的诠释,也希望您与大家分享一下,谢谢!

相关资讯

  • C#怎么获取文件夹里所有的图片文件?

    在实际的程序开发中,我们经常需要获取某个文件夹下的所有图片,用到了C#的DirectoryInfo、GetFiles等文件操作方法,具体实现如下://自定义一个结构public struct sFileInfo{ public string FileName; public DateTime FileCreateTime;}protected void Page_Load(…

    2021/3/4 21:48:01
  • c#实现日期时间与unix时间戳互相转换

    为什么使用时间戳?关于Unix时间戳,大概是这个意思,从1970年0时0分0秒开始到现在的秒数.使用它来获得的是一个INT值,储存在数据库里只要使用INT格式就可以了,方便数据库进行排序,搜索,而且比datetime格式更节省数据库空间。 /// <summary> /// Uni…

    2021/3/4 21:40:22