成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析ASP.NET的TypeResolver

開發 后端
本文介紹JavaScriptTypeResolver是一個抽象類,雖然是第一次在Atlas多個Release中出現,但是它并不是一個新鮮事物。

一、客戶端的序列化與反序列化能力

在ASP.NET AJAX中,為客戶端提供序列化能力的是Sys.Serialization.JavaScriptSerializer類的serialize靜態方法。這個方法能夠將一個客戶端對象序列化成為一個JSON字符串,它的使用方法非常簡單。如下:

  1. var jsonStr = Sys.Serialization.JavaScriptSerializer.serialize(obj); 

沒有過多可說的內容,可能比較“有特點”的地方就是它對于客戶端Date對象的序列化操作。如果我們調用下面的代碼,會出現什么結果呢?

  1. var jsonStr = Sys.Serialization.JavaScriptSerializer.serialize(new Date()); 

得到的結果類似于是“"@1162814090119@"”,請注意兩邊還有雙引號。這個是一個ASP.NET AJAX對于Date對象比較特殊的表示方法,如果在某些時候開發人員需要自己來“拼接”字符串時,就需要注意這一點。

給ASP.NET AJAX客戶端帶來反序列化能力的就是Sys.Serialization.JavaScriptSerializer類的deserialize靜態方法。如下:

  1. var obj = Sys.Serialization.JavaScriptSerializer.deserialize(jsonStr);  

它事實上只是簡單地調用了 JavaScript內置的eval方法。當然,既然序列化時對于Date對象有特殊的表示方法,在反序列化時,也會考慮到這一點: Sys.Serialization.JavaScriptSerializer類的deserialize靜態方法在調用Evail之前,會把 “"@...@"”變成“new Date(...)”的形式,這就是標準的JSON字符串了。

二、JavaScriptTypeResolver與JavaScriptConverter

客戶端的序列化和反序列化非常簡單,我把它放在這里一并說明更像是為了讓內容更加完整。而服務器端的序列化與反序列化就不是那么輕易的了,它涉及到大量的字符串操作,也涉及到一定的自定義能力。這才是這片文章想要著重說明的。

ASP.NET AJAX提供的序列化和反序列化能力都是由Microsoft.Web.Script.Serialization這個命名空間下的類完成的。不過幸運的是,他們大都是內部類,真正能夠給開發人員使用的只有JavaScriptSerializer類的數個方法而已。ASP.NET AJAX已經帶給我們比較充足的序列化與反序列化的能力,我們只需要掌握它,知道它們是如何工作的,那一般也就足夠了。

不過要進入對于這些序列化與反序列化能力的了解,首先需要了解其它的兩個類:JavaScriptTypeResolver和JavaScriptConverter。

1、JavaScriptTypeResolver

JavaScriptTypeResolver是一個抽象類,雖然是第一次在Atlas多個Release中出現,但是它并不是一個新鮮事物。它的作用就相當于Atlas CTP中的IJavaScriptSerializeContext接口,甚至可以說只是換了類名和方法名(事實上,從一個接口轉變為一個抽象類,這個做法讓人摸不著頭腦,因為現在的抽象類也不存在任何的實現)。這個類的作用是“將一個字符串,與一個特定的類進行關聯,使字符串成為那個特定類的一個標識 ”。這個抽象類存在著兩個方法:
1). String ResolveTypeId(Type):得到Type對象的標識字符串。
2). Type ResolveType(String):從字符串標識獲取一個Type對象。

可以看出,這兩個方法是一對相反的操作。他們會分別運用在序列化于反序列化操作之中。如果對于這個類的作用還不是非常了解的話,那么可以看一下 ASP.NET AJAX中這個抽象類的一個簡單實現。那就是 Microsoft.Web.Script.Serialization.SimpleTypeResolver類。它的代碼如下:

  1. public sealed class SimpleTypeResolver : JavaScriptTypeResolver  
  2. {  
  3. public override Type ResolveType(string id)  
  4. {  
  5. return Type.GetType(id);  
  6. }  
  7. public override string ResolveTypeId(Type type)  
  8. {  
  9. if (type == null)  
  10. {  
  11. throw new ArgumentNullException("type");  
  12. }  
  13. return type.AssemblyQualifiedName;  
  14. }  

SimpleTypeResolver的作用是將一個類的Assembly Qualified Name與一個類型關聯了起來。但是個人認為千萬不要使用這個類,如果用了這個類的話,Strong Named Assembly的信息不是都暴露出去了嗎?Version,Culture,PublicKeyToken,“一個都不能少”。

2、JavaScriptConverter

JavaScriptConverter類的作用是提供了開發人員自定義序列化與反序列化的能力,這一點對于操作含有循環引用的復雜對象尤其重要。在之前的文章中我分析過這個類,也有過這個類的使用示例。不過這個類在RTM Release中的功能被精簡了。它的方法和屬性被縮減成了三個:

1). IEnumerable<Type> SupportedTypes:只讀屬性,返回這個Converter所有能夠支持的類。
2). object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer):
這個方法的第一個參數是一個字典,有朋友可能會認為這個字典和JSON字符串的表示非常的接近:由Dictionary和List嵌套而成,最底端的元素為一些基本類型對象。不過事實上不是如此。ASP.NET AJAX在反序列化一個JSON字符串時,如果出現了“{ "__type" : "...", ...}” 這樣的片斷時,在將其轉換為真正的JSON表示的Dictionary(只存在基本類型對象的Dictionary)之后,如果發現該 Dictionary存在“__type”這個Key,那么就會設法在這個時候就將它轉換為__type值表示的那個類型了。也就是說, JavaScriptConverter的Deserialize方法接受到的第一個參數字典中,也有可能已經是一個特殊的類型了。
第二個參數為轉換的目標類型。而第三個參數,則是調用當前Deserialize方法的JavaScriptSerializer了,我們的一些反序列化操作可以委托給它執行,它已經關聯好了web.config中配置的JavaScriptConverter。不過需要注意的就是,千萬要避免下一步操作又沒有改變地回到了當前的Deserialize方法,顯然這樣會出現死循環。
3). IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer):這個方法的作用相對純粹一些,將obj對象轉換為一個IDictionary<string, object>對象,在這個方法將結果返回后,ASP.NET AJAX會在這個Dictionary中添加“__type”的值,這樣的話,在反序列化時也能夠使用當前的JavaScriptConverter來進行相反的操作。


3、使用JavaScriptTypeResolver與JavaScriptConveter

當定義了JavaScriptTypeResolver與JavaScriptConverter后,還需要將其添加進某個JavaScriptSerializer后才能生效。代碼大致如下:

  1. // 定義一個JavaScriptTypeResolver實例  
  2. JavaScriptTypeResolver resolver = new MyTypeResolver();  
  3. // 創建一個使用上面Resolver的JavaScriptSerializer  
  4. JavaScriptSerializer serializer = new JavaScriptSerializer(resolver);  
  5. // 創建一個JavaScriptConverter數組  
  6. JavaScriptConverter[] converters = new JavaScriptConverter[] { new MyConverter() };  
  7. // 將Converter關聯到Serializer中  
  8. serializer.RegisterConverters(converters);  
  9. // 使用JavaScriptSerializer進行序列化或反序列化操作  
  10. serializer.Serialize(...); 

關于JavaScriptConverter的使用,還需要提一點,就是在web.config文件中可以進行一些配置。如下:

  1. <jsonSerialization> 
  2. <converters> 
  3. <add name="..." type="..." /> 
  4. ...  
  5. </converters> 
  6. </jsonSerialization> 
  7.  

需要注意的是,有些朋友認為在 web.config里進行了JavaScriptConverter配置后,這些Converter就會默認被運用在 JavaScriptSerializer的使用上。但是事實上這些配置的Converter只會被運用在Web Service的訪問上,如果新創建了一個JavaScriptSerializer,則需要重新分配,才能使JavaScriptConverter生效。

【編輯推薦】

  1. ASP.NET中的WebRequestExecutor
  2. IIS6的ASP.NET ISAPI請求處理過程
  3. ASP.NET中的備份
  4. 淺談ASP.NET ISAPI
  5. ASP.NET的IIS ISAPI extension
責任編輯:佚名 來源: IT專家網
相關推薦

2009-07-27 15:34:11

MembershipASP.NET

2009-08-05 18:36:12

ASP.NET Che

2009-07-24 13:41:15

ASP.NET AJA

2009-07-31 12:43:59

ASP.NET MVC

2009-08-05 15:50:13

ASP.NET優點

2009-07-22 18:03:00

ASP.NET ASP

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設計

2009-07-29 14:12:45

ASP.NET tra

2009-07-28 10:59:13

ASP.NET IIS

2009-07-29 09:34:54

IsPostBack屬ASP.NET

2009-08-04 17:16:16

ASP.NET代碼優化

2009-08-05 16:17:29

ASP.NET For

2009-08-05 16:50:09

ASP.NET For

2009-07-24 18:02:46

ASP.NET編程

2009-08-05 16:53:14

ASP.NET組件設計

2009-08-10 14:55:43

ASP.NET htt

2009-08-03 10:07:20

ASP.NET Ses

2009-07-27 17:25:53

ASP.NET驗證控件

2009-08-10 18:19:37

ASP.NET安裝環境

2009-07-27 14:24:16

ASP.NET訪問權限
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性做久久久久久免费观看欧美 | 干一干操一操 | 91在线精品一区二区 | 日韩一区中文字幕 | 91精品国产一区 | 狠狠艹| 久久久久久国产 | 色视频在线免费观看 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 日日日日日日bbbbb视频 | 国产色网站 | 成人片免费看 | 日本午夜视频 | 婷婷国产一区二区三区 | 麻豆久久久9性大片 | 亚洲免费在线视频 | 欧美理论片在线 | 国产视频久久久 | 亚洲综合色丁香婷婷六月图片 | 欧美三级电影在线播放 | 91伦理片| 精品久久久久一区 | 黄色大片网站 | 国产精品一卡二卡三卡 | 亚洲精品成人 | 日韩中文字幕 | 亚洲一区综合 | 国产精品性做久久久久久 | 白浆在线| 久久国品片| 欧美精品久久久久 | 国产美女免费视频 | 国产精品中文字幕在线观看 | 成人伊人 | 成年视频在线观看 | 成人日韩av | 91精品久久久久久综合五月天 | 国产98在线 | 免费, | 不卡在线视频 | 手机看片1| 99精品国自产在线 |