序列化:将对象转换成字节流的过程,这样就能够轻松将对象保存在磁盘文件或数据库中。javascript
反序列化:序列化的逆过程,就是将字节流转换回原来的对象的过程。前端
把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。两个环节为可逆性的。java
先看一个例子,咱们经过例子更加直观的对其进行了解。咱们定义一个Person类,里面定义了一些字段,在Main方法中实例化一个对象。咱们对person对象进行序列化与反序列化操做git
public class Person { public string Name; public int Age; public Guid TokenId; public DateTime RegTime; public Person Child; public Person Friend; } class Program { static void Main(string[] args) { var person = new Person { Name = "张三<zhangsan>", Age = 12, TokenId = Guid.NewGuid(), Child = new Person { Age = 1, Name = "小张", RegTime = DateTime.Now, TokenId = Guid.NewGuid() } }; //序列化 JavaScriptSerializer serializer = new JavaScriptSerializer(); Console.WriteLine("使用 JavaScriptSerializer序列化"); var jsstr = serializer.Serialize(person); //使用 JavaScriptSerializer序列化 Console.WriteLine(jsstr); Console.WriteLine("使用 JsonConvert序列化"); string newtostr = JsonConvert.SerializeObject(person, Formatting.Indented, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });//使用 JsonConvert序列化 Console.WriteLine(newtostr); Console.ReadLine(); } }
(一)、JavaScriptSerializer序列化是先生成一个对象,而后调用它的成员函数Serialize进行序列化github
注意添加对using System.Web.Script.Serialization的引用,使用此引用,须要首先引入System.Web.Extensions.dll文件。数据库
JavaScriptSerializer serializer = new JavaScriptSerializer(); var jsstr = serializer.Serialize(person);
(二)、Json.net直接使用提供的静态成员JsonConvert.SerializeObject进行序列化json
string newtostr = JsonConvert.SerializeObject(person);
上面红色框为JavaScriptSerializer的结果,下面绿色框为Json.net的结果,这里须要注意几个地方:数组
一、 JavaScriptSerializer序列化后的时间格式:"\/Date(1441813200214)\/" 表示的是1970年1月1日(DateTime的最小值)到date实际表示的日期之差的总毫秒数。一般咱们须要把它转成标准的时间格式。能够用下面的方法进行字符串处理:函数
jsstr = Regex.Replace(jsstr, @"\\/Date\((\d+)\)\\/", match => { DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)); dt = dt.ToLocalTime(); return dt.ToString("yyyy-MM-dd HH:mm:ss"); });
二、Json.net默认生成的日期也不方便客户端阅读,须要简单的处理一下:ui
string newtonstr = JsonConvert.SerializeObject(p, Formatting.Indented, new IsoDateTimeConverter() {DateTimeFormat = "yyyy-MM-dd HH:mm:ss"});
三、JavaScriptSerializer序列化会对特殊字符(如<>等)进行编码,好比上面的\u003c \u003e,不少人看到这个的时候,第一感受就是太扯蛋了,接下来就是各类百度,怎么把这个转成正常的”<>”。实际上你不用作任何操做,这是标准的JS编码方式,前端会自行处理这个问题。好比:
<script type="text/javascript"> var str = 'yubaolee <yubaolee>' var str2 = 'yubaolee \u003cyubaolee\u003e'; alert(str == str2); //结果为true </script>
附:若是你真的不明白\u003c这究竟是个什么玩意,请移步:字符编码。
惯例依旧,咱们先上一段代码,此部分代码是对上一段代码的再进行。
public class Person { public string Name; public int Age; public Guid TokenId; public DateTime RegTime; public Person Child; public Person Friend; } class Program { static void Main(string[] args) { var person = new Person { Name = "张三<zhangsan>", Age = 12, TokenId = Guid.NewGuid(), Child = new Person { Age = 1, Name = "小张", RegTime = DateTime.Now, TokenId = Guid.NewGuid() } }; ////序列化 //JavaScriptSerializer serializer = new JavaScriptSerializer(); //Console.WriteLine("使用 JavaScriptSerializer序列化"); //var jsstr = serializer.Serialize(person); //使用 JavaScriptSerializer序列化 //Console.WriteLine(jsstr); Console.WriteLine("使用 JsonConvert序列化"); string newtostr = JsonConvert.SerializeObject(person, Formatting.Indented, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });//使用 JsonConvert序列化
//反序列化 JavaScriptSerializer serializer = new JavaScriptSerializer(); var objOne = serializer.Deserialize<Person>(newtostr); var objTwo = JsonConvert.DeserializeObject<Person>(newtostr);
Console.WriteLine(newtostr); Console.ReadLine(); }
(一)、使用JavaScriptSerializer方法进行反序列化
JavaScriptSerializer serializer = new JavaScriptSerializer(); var objOne = serializer.Deserialize<Person>(newtostr);
(二)、使用JsonConvert方法进行反序列化
var objTwo = JsonConvert.DeserializeObject<Person>(newtostr);
4、 几种方式效率的对比
详细对比过程请参阅:https://github.com/kevin-montrose/Jil
谈到序列化与反序列,咱们不得不提到一种运用很是普遍的数据格式:Json。在用.net处理的时候,咱们常常用的都是序列化与反序列化,就是咱们上面讲解的知识点,接下来咱们会接着继续讲解Json数据格式,在前端的处理形式。
JSON 的语法能够表示如下三种类型的值。
简单值:使用与 JavaScript 相同的语法,能够在 JSON 中表示字符串、数值、布尔值和 null。但 JSON 不支持 JavaScript 中的特殊值 undefined。
对象:对象做为一种复杂数据类型,表示的是一组无序的键值对儿。而每一个键值对儿中的值能够是简单值,也能够是复杂数据类型的值。
数组:数组也是一种复杂数据类型,表示一组有序的值的列表,能够经过数值索引来访问其中的值。数组的值也能够是任意类型——简单值、对象或数组。Json不支持变量、函数或对象实例,它就是一种表示结构化数据的格式,虽然与 JavaScript 中表示数据的某些语法相同,但它并不局限于 JavaScript 的范畴。
六 、JSON对象
JSON对象有两个方法: stringify()和 parse()。在最简单的状况下,这两个方法分别用于把JavaScript 对象序列化为 JSON字符串和把 JSON字符串解析为原生 JavaScript 值。例如:
var book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas" ], edition: 3, year: 2011 }; var jsonText = JSON.stringify(book);
这个例子使用 JSON.stringify()把一个 JavaScript 对象序列化为一个 JSON 字符串,而后将它保存在变量 jsonText 中。默认状况下, JSON.stringify()输出的 JSON 字符串不包含任何空格字符或缩进,所以保存在 jsonText 中的字符串以下所示:
{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3, "year":2011}
将 JSON 字符串直接传递给 JSON.parse()就能够获得相应的 JavaScript 值。例如,使用下列代码就能够建立与 book 相似的对象:
var bookCopy = JSON.parse(jsonText);
注意,虽然 book 与 bookCopy 具备相同的属性,但它们是两个独立的、没有任何关系的对象。若是传给 JSON.parse()的字符串不是有效的 JSON,该方法会抛出错误。