日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
淺析ASP.NET的TypeResolver

一、客戶(hù)端的序列化與反序列化能力

在ASP.NET AJAX中,為客戶(hù)端提供序列化能力的是Sys.Serialization.JavaScriptSerializer類(lèi)的serialize靜態(tài)方法。這個(gè)方法能夠?qū)⒁粋€(gè)客戶(hù)端對(duì)象序列化成為一個(gè)JSON字符串,它的使用方法非常簡(jiǎn)單。如下:

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

沒(méi)有過(guò)多可說(shuō)的內(nèi)容,可能比較“有特點(diǎn)”的地方就是它對(duì)于客戶(hù)端Date對(duì)象的序列化操作。如果我們調(diào)用下面的代碼,會(huì)出現(xiàn)什么結(jié)果呢?

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

得到的結(jié)果類(lèi)似于是“"@1162814090119@"”,請(qǐng)注意兩邊還有雙引號(hào)。這個(gè)是一個(gè)ASP.NET AJAX對(duì)于Date對(duì)象比較特殊的表示方法,如果在某些時(shí)候開(kāi)發(fā)人員需要自己來(lái)“拼接”字符串時(shí),就需要注意這一點(diǎn)。

給ASP.NET AJAX客戶(hù)端帶來(lái)反序列化能力的就是Sys.Serialization.JavaScriptSerializer類(lèi)的deserialize靜態(tài)方法。如下:

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

它事實(shí)上只是簡(jiǎn)單地調(diào)用了 JavaScript內(nèi)置的eval方法。當(dāng)然,既然序列化時(shí)對(duì)于Date對(duì)象有特殊的表示方法,在反序列化時(shí),也會(huì)考慮到這一點(diǎn): Sys.Serialization.JavaScriptSerializer類(lèi)的deserialize靜態(tài)方法在調(diào)用Evail之前,會(huì)把 “"@...@"”變成“new Date(...)”的形式,這就是標(biāo)準(zhǔn)的JSON字符串了。

二、JavaScriptTypeResolver與JavaScriptConverter

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

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

不過(guò)要進(jìn)入對(duì)于這些序列化與反序列化能力的了解,首先需要了解其它的兩個(gè)類(lèi):JavaScriptTypeResolver和JavaScriptConverter。

1、JavaScriptTypeResolver

JavaScriptTypeResolver是一個(gè)抽象類(lèi),雖然是第一次在Atlas多個(gè)Release中出現(xiàn),但是它并不是一個(gè)新鮮事物。它的作用就相當(dāng)于Atlas CTP中的IJavaScriptSerializeContext接口,甚至可以說(shuō)只是換了類(lèi)名和方法名(事實(shí)上,從一個(gè)接口轉(zhuǎn)變?yōu)橐粋€(gè)抽象類(lèi),這個(gè)做法讓人摸不著頭腦,因?yàn)楝F(xiàn)在的抽象類(lèi)也不存在任何的實(shí)現(xiàn))。這個(gè)類(lèi)的作用是“將一個(gè)字符串,與一個(gè)特定的類(lèi)進(jìn)行關(guān)聯(lián),使字符串成為那個(gè)特定類(lèi)的一個(gè)標(biāo)識(shí) ”。這個(gè)抽象類(lèi)存在著兩個(gè)方法:
1). String ResolveTypeId(Type):得到Type對(duì)象的標(biāo)識(shí)字符串。
2). Type ResolveType(String):從字符串標(biāo)識(shí)獲取一個(gè)Type對(duì)象。

可以看出,這兩個(gè)方法是一對(duì)相反的操作。他們會(huì)分別運(yùn)用在序列化于反序列化操作之中。如果對(duì)于這個(gè)類(lèi)的作用還不是非常了解的話(huà),那么可以看一下 ASP.NET AJAX中這個(gè)抽象類(lèi)的一個(gè)簡(jiǎn)單實(shí)現(xiàn)。那就是 Microsoft.Web.Script.Serialization.SimpleTypeResolver類(lèi)。它的代碼如下:

 
 
 
  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的作用是將一個(gè)類(lèi)的Assembly Qualified Name與一個(gè)類(lèi)型關(guān)聯(lián)了起來(lái)。但是個(gè)人認(rèn)為千萬(wàn)不要使用這個(gè)類(lèi),如果用了這個(gè)類(lèi)的話(huà),Strong Named Assembly的信息不是都暴露出去了嗎?Version,Culture,PublicKeyToken,“一個(gè)都不能少”。

2、JavaScriptConverter

JavaScriptConverter類(lèi)的作用是提供了開(kāi)發(fā)人員自定義序列化與反序列化的能力,這一點(diǎn)對(duì)于操作含有循環(huán)引用的復(fù)雜對(duì)象尤其重要。在之前的文章中我分析過(guò)這個(gè)類(lèi),也有過(guò)這個(gè)類(lèi)的使用示例。不過(guò)這個(gè)類(lèi)在RTM Release中的功能被精簡(jiǎn)了。它的方法和屬性被縮減成了三個(gè):

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

3、使用JavaScriptTypeResolver與JavaScriptConveter

當(dāng)定義了JavaScriptTypeResolver與JavaScriptConverter后,還需要將其添加進(jìn)某個(gè)JavaScriptSerializer后才能生效。代碼大致如下:

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

關(guān)于JavaScriptConverter的使用,還需要提一點(diǎn),就是在web.config文件中可以進(jìn)行一些配置。如下:

 
 
 
  1.  
  2.  
  3.  name="..." type="..." /> 
  4. ...  
  5.  
  6.  
  7.  

需要注意的是,有些朋友認(rèn)為在 web.config里進(jìn)行了JavaScriptConverter配置后,這些Converter就會(huì)默認(rèn)被運(yùn)用在 JavaScriptSerializer的使用上。但是事實(shí)上這些配置的Converter只會(huì)被運(yùn)用在Web Service的訪問(wèn)上,如果新創(chuàng)建了一個(gè)JavaScriptSerializer,則需要重新分配,才能使JavaScriptConverter生效。


網(wǎng)站題目:淺析ASP.NET的TypeResolver
標(biāo)題鏈接:http://www.5511xx.com/article/coipjpc.html