亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

淺析JavaScriptSerializer類的序列化與反序列化

2019-11-19 18:53:31
字體:
來源:轉載
供稿:網友

JavaScriptSerializer 類由異步通信層內部使用,用于序列化和反序列化在瀏覽器和 Web 服務器之間傳遞的數據。說白了就是能夠直接將一個C#對象傳送到前臺頁面成為javascript對象。要添加System.Web.Extensions.dll的引用。該類位于System.Web.Script.Serialization命名空間下。

一、屬性

MaxJsonLength 獲取或設置 JavaScriptSerializer 類接受的 JSON 字符串的最大長度。
RecursionLimit 獲取或設置用于約束要處理的對象級別的數目的限制。

二、方法

ConvertToType<(Of <(T>)>) 將給定對象轉換為指定類型。
Deserialize<(Of <(T>)>) 將指定的 JSON 字符串轉換為 T 類型的對象。
DeserializeObject 將指定的 JSON 字符串轉換為對象圖。
RegisterConverters 使用 JavaScriptSerializer 實例注冊自定義轉換器。
Serialize 已重載。 將對象轉換為 JSON 字符串。

 給個示例,主要就是了解了一下Serialize與Deserialize兩個方法,控制器代碼:

public class HomeController : Controller {  public ActionResult Index()  {   return View();  }  public ActionResult GetJson()  {   JavaScriptSerializer jss = new JavaScriptSerializer();   Person p = new Person(1, "張飛", 20);   string json = jss.Serialize(p); //序列化成JSON   Person p1 = jss.Deserialize<Person>(json); //再反序列化為Person對象 注意此方法要求目標類有無參構造函數   //return Json(json, "text/json");  //很好用,但是返回的終歸是字符串,返回到前臺要解析一下才能變成javascript對象。   return Json(new { Id = p1.Id, Name = p1.Name, Age = p1.Age }, "text/json");//如果這樣寫,返回到javascript中是不用再解析的,直接就是javascript對象  } } public class Person {  public Person()  { }  public Person(int id, string name, int age)  {   this.Id = id;   this.Name = name;   this.Age = age;  }  public int Id { get; set; }  public string Name { get; set; }  public int Age { get; set; } }

    前臺HTML代碼:

<html><head> <title>javascriptSerializer類測試</title> <script src="/jQuery.1.8.3.js" type="text/javascript"></script> <script type="text/javascript">  $(function () {   $(":button").click(function () {    $.ajax({     url: "/Home/GetJson",     dataType: "json",     type: "post",     success: function (response) {//      var data = JSON.parse(response);//      $("#Id").text(data.Id);//      $("#Name").text(data.Name);//      $("#Age").text(data.Age);      $("#Id").text(response.Id);      $("#Name").text(response.Name);      $("#Age").text(response.Age);     }    })   })  }) </script></head><body> <ul>  <li id="Id"></li>  <li id="Name"></li>  <li id="Age"></li> </ul> <input type="button" value="確認" /></body></html>

試下4個基礎方法與屬性

class Program {  static void Main(string[] args)  {   // 方法    // RegisterConverters 使用 JavaScriptSerializer 實例注冊自定義轉換器。    //屬性   // RecursionLimit 獲取或設置用于約束要處理的對象級別的數目的限制。    JavaScriptSerializer jss = new JavaScriptSerializer();   Console.WriteLine(jss.MaxJsonLength); //默認接受最大的長度是 2097152 這個是接受JSON字符串的最大長度,超長會有什么后果呢?試下   jss.MaxJsonLength = 1;   Person p = new Person(1,"關羽",21);   //string json = jss.Serialize(p);  //將對象序列化成Json字符串 //此處報異常使用 JSON JavaScriptSerializer 進行序列化或反序列化時出錯。字符串的長度超過了為 maxJsonLength 屬性設置的值。   jss.MaxJsonLength = 2097152;      //序列化   string json = jss.Serialize(p);    Console.WriteLine(json); //輸出 {"Id":1,"Name":"關羽","Age":21}`這就是Json格式了   //反序列化Deserialize   Person p2 = jss.Deserialize<Person>("{/"Id/":1,/"Name/":/"關羽/",/"Age/":21}");   Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //輸出 1 關羽 21   //Deserialize的非泛型寫法   Person p3 = jss.Deserialize("{/"Id/":1,/"Name/":/"關羽/",/"Age/":21}",typeof(Person)) as Person; //注意這個方法返回的是object類,因此要強制轉換成Person類   Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同樣輸出 1 關羽 21   object obj = jss.DeserializeObject("{/"Id/":1,/"Name/":/"關羽/",/"Age/":21}"); //將Json字符轉換為Object類型   //Person p4 = obj as Person; //此行代碼轉為的p4為null   Person p4 = jss.ConvertToType<Person>(obj);  //尼瑪,原來這個方法是這樣用的,知道DeserializeObject轉換會為null所以另外寫一個嗎   Console.WriteLine(p4.Name);  //輸出關羽   //非泛型版本   Person p5 = jss.ConvertToType(obj,typeof(Person)) as Person;   Console.WriteLine(p5.Name);  //輸出關羽   Console.ReadKey();  } }

實現自定義轉換器

  將指定的數據類型序列化為Json。Serialize方法是個遞歸方法,會遞歸地序列化對象的屬性,因此在序列化一個復雜對象(比如DataTable)時往往會出現“循環引用”的異常,這時候就需要針對復雜類型自定義一個轉換器。下面是DataTable的轉換器,原理是把DataTable轉換成一個字典列表后再序列化:

所有自定義的轉換器都要繼承于JavaScriptConverter,并實現Serialize、Deserialize方法和SupportedTypes屬性,其中SupportedTypes屬性用于枚舉此轉換器支持的類型。

class Program {  static void Main(string[] args)  {   DataTable dt = new DataTable();   dt.Columns.Add("Id");   dt.Columns.Add("Name");   dt.Columns.Add("Age");   dt.Rows.Add(1, "關羽", 21);   dt.Rows.Add(2, "劉備", 22);   dt.Rows.Add(3, "張飛", 20);   JavaScriptSerializer jss = new JavaScriptSerializer();   //注冊轉換器的方法,用于復雜轉換  除了實現還需要注冊到JavaScriptSerializer   jss.RegisterConverters(new JavaScriptConverter[] { new DataTableConverter() });   string strJson = jss.Serialize(dt);   Console.WriteLine(strJson);   //輸出 {"Rows":[{"Id":"1","Name":"關羽","Age":"21"},{"Id":"2","Name":"劉備","Age":"22"},{"Id":"3","Name":"張飛","Age":"20"}]}   Console.ReadKey();  } } /// <summary> /// DataTable JSON轉換類 /// </summary> public class DataTableConverter : JavaScriptConverter {  public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)  {   DataTable dt = obj as DataTable;   Dictionary<string, object> result = new Dictionary<string, object>();   List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();   foreach (DataRow dr in dt.Rows)   {    Dictionary<string, object> row = new Dictionary<string, object>();    foreach (DataColumn dc in dt.Columns)    {     row.Add(dc.ColumnName, dr[dc.ColumnName]);    }    rows.Add(row);   }   result["Rows"] = rows;   return result;  }  public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)  {   throw new NotImplementedException();  }  /// <summary>  /// 獲取本轉換器支持的類型  /// </summary>  public override IEnumerable<Type> SupportedTypes  {   get { return new Type[] { typeof(DataTable) }; }  } }

限制序列化的層次

 class Program {  static void Main(string[] args)  {   JavaScriptSerializer jss = new JavaScriptSerializer();   Console.WriteLine(jss.RecursionLimit); //默認的序列化層次是100   Person p1 = new Person(1, "劉備", 24);   p1.p = new Person(2, "關羽", 23);   p1.p.p = new Person(3, "張飛", 21);   string strJson = jss.Serialize(p1);   Console.WriteLine(strJson);   //輸出 {"Id":1,"Name":"劉備","Age":24,"p":{"Id":2,"Name":"關羽","Age":23,"p":{"Id":3,"Name":"張飛","Age":21,"p":null}}}   //現在將層次減少到1   jss.RecursionLimit = 1;   string strJson2 = jss.Serialize(p1);//這行代碼是報異常的,顯示已超出 RecursionLimit。 這就是這個屬性的作用      //最后再來說一個特性,比如如果我有某一個屬性不希望它序列化,那么可以設置添加      Console.ReadKey();  } } public class Person {  public Person()  { }  public Person(int id, string name, int age)  {   this.Id = id;   this.Name = name;   this.Age = age;  }  public int Id { get; set; }   public string Name { get; set; }   public int Age { get; set; }   //里面嵌套一個Person  public Person p { get; set; } }

    [ScriptIgnore]禁止某屬性序列化

class Program {  static void Main(string[] args)  {   JavaScriptSerializer jss = new JavaScriptSerializer();   Person p = new Person(1,"劉備",24);   Console.WriteLine(jss.Serialize(p));   File.WriteAllText(@"D:/123.txt", jss.Serialize(p)); //輸出 {"Id":1,"Age":24}   Console.ReadKey();  } } public class Person {  public Person()  { }  public Person(int id, string name, int age)  {   this.Id = id;   this.Name = name;   this.Age = age;  }  public int Id { get; set; }   [ScriptIgnore]  public string Name { get; set; }   public int Age { get; set; } }

以上就是本文的全部內容,希望對大家有所幫助,謝謝對武林網的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线观看网站| 日韩av影视在线| 久久黄色av网站| 中文字幕精品在线视频| 欧美黄网免费在线观看| 91系列在线播放| 久久久国产精品视频| 国产精品久久久久久久久久小说| 久久97久久97精品免视看| 激情av一区二区| 国产精品在线看| 国产免费观看久久黄| 欧美大尺度激情区在线播放| 亚洲人成在线观| 亚洲成av人影院在线观看| 国产精品网站视频| 欧美黑人狂野猛交老妇| xvideos成人免费中文版| 欧美人与性动交a欧美精品| 91av免费观看91av精品在线| 日韩中文字幕精品视频| 亚洲电影免费观看高清完整版在线观看| 欧美日韩一区二区三区在线免费观看| 红桃视频成人在线观看| 欧美激情亚洲国产| 岛国av一区二区三区| 日韩国产精品视频| 在线电影欧美日韩一区二区私密| 欧美性videos高清精品| 国产亚洲人成a一在线v站| 亚洲精品国产精品自产a区红杏吧| 国产成人小视频在线观看| 欧美日韩中文字幕在线视频| 91精品视频在线看| 97久久精品视频| 国产精品久久久久久久久久ktv| 91精品国产免费久久久久久| 精品在线观看国产| 91精品国产91| 精品国产欧美一区二区五十路| 午夜精品视频在线| 国产亚洲成av人片在线观看桃| 色综合久久88| 亚洲精品久久久久中文字幕二区| 亚洲欧美日韩中文视频| 成人在线播放av| 92裸体在线视频网站| 日韩中文字幕第一页| 色综合视频一区中文字幕| 欧美性视频精品| 不卡av在线播放| 91精品国产精品| 日韩精品福利网站| 久久久99久久精品女同性| 久操成人在线视频| 最近更新的2019中文字幕| 国产人妖伪娘一区91| 亚洲毛片在线免费观看| 色综合伊人色综合网站| 国产精品爱久久久久久久| 欧美丰满少妇xxxxx| 91精品国产综合久久香蕉| 九九久久久久久久久激情| 日本中文字幕不卡免费| 一区二区三区视频在线| 欧美日韩国产在线播放| 久久中文字幕一区| 亚洲欧美在线磁力| 亚洲国产欧美一区二区三区同亚洲| 成人欧美一区二区三区在线湿哒哒| 亚洲成人网av| 日韩专区在线播放| 久久天堂电影网| 在线免费看av不卡| 国产在线拍偷自揄拍精品| 91精品久久久久久久久中文字幕| 久青草国产97香蕉在线视频| 久久人人爽人人爽人人片亚洲| 欧美天天综合色影久久精品| 热99精品里视频精品| 成人精品一区二区三区电影免费| 日韩美女毛茸茸| 欧美在线视频在线播放完整版免费观看| 日本精品一区二区三区在线播放视频| 国产中文字幕亚洲| 中文字幕日韩欧美在线视频| 91精品久久久久久久久中文字幕| 热久久视久久精品18亚洲精品| 69av成年福利视频| 亚洲自拍欧美色图| 亚洲香蕉伊综合在人在线视看| 91精品中文在线| 青青a在线精品免费观看| 久久久久久com| 精品福利在线观看| 91精品综合久久久久久五月天| 国产成人av网址| 欧美—级a级欧美特级ar全黄| 亚洲综合色激情五月| 韩国日本不卡在线| 中文字幕亚洲无线码在线一区| 免费91麻豆精品国产自产在线观看| 久久婷婷国产麻豆91天堂| 成人免费看黄网站| 成人免费看黄网站| 成人在线视频网| 久久久久久久999| 日韩电影免费在线观看| 久久噜噜噜精品国产亚洲综合| 国产精品午夜国产小视频| 国产精品久久电影观看| 欧美日韩加勒比精品一区| 精品国产乱码久久久久酒店| 成人激情视频在线播放| 欧美激情女人20p| 欧美成人精品在线视频| 亚洲女人被黑人巨大进入| 欧美一级免费视频| 国产成人亚洲精品| 国产精品电影网| 91九色在线视频| 国产日韩在线看| 亚洲成人精品久久| 高清一区二区三区日本久| 亚洲成人精品视频在线观看| 亚洲jizzjizz日本少妇| 欧美国产视频日韩| 久久久久久噜噜噜久久久精品| 性色av一区二区三区| 欧美日韩亚洲激情| 美女国内精品自产拍在线播放| 国产精品久久综合av爱欲tv| 国内精品国产三级国产在线专| 亚洲欧美国内爽妇网| 日韩精品免费电影| 亚洲精品720p| 亚洲一区二区在线播放| 久久久久久久久久国产精品| 欧美色视频日本高清在线观看| 欧美日韩国产麻豆| 亚洲精品国精品久久99热一| 国产精品一久久香蕉国产线看观看| 国产亚洲精品成人av久久ww| 97超级碰碰碰| 国产综合视频在线观看| 中文字幕v亚洲ⅴv天堂| 日韩欧美精品网址| 乱亲女秽乱长久久久| 91情侣偷在线精品国产| 青草青草久热精品视频在线观看| 国产亚洲激情在线| 精品久久久久久亚洲精品| 最近的2019中文字幕免费一页| 亚洲欧美国产另类| 91豆花精品一区| 奇米影视亚洲狠狠色| 精品精品国产国产自在线| 欧美日韩亚洲视频| 综合136福利视频在线| 欧美中文在线免费| 亚洲国产精品成人精品| 孩xxxx性bbbb欧美| 国产精品美女999| 97久久精品人人澡人人爽缅北|