詳解ASP.NET AJAX客戶端
在ASP.NET AJAX中使用了JSON作為客戶端與服務(wù)器端傳遞對(duì)象信息的方式。因此,在ASP.NET AJAX客戶端與服務(wù)器端均提供了序列化與反序列化的能力。了解這些內(nèi)容的使用方法,可以說是使用與擴(kuò)展ASP.NET AJAX所必須的能力。我們就來看一下ASP.NET AJAX中的序列化與反序列化的能力。
一、客戶端的序列化與反序列化能力:
在ASP.NET AJAX中,為客戶端提供序列化能力的是Sys.Serialization.JavaScriptSerializer類的serialize靜態(tài)方法。這個(gè)方法能夠?qū)⒁粋€(gè)客戶端對(duì)象序列化成為一個(gè)JSON字符串,它的使用方法非常簡單。如下:
- var jsonStr = Sys.Serialization.JavaScriptSerializer.serialize(obj);
沒有過多可說的內(nèi)容,可能比較“有特點(diǎn)”的地方就是它對(duì)于客戶端Date對(duì)象的序列化操作。如果我們調(diào)用下面的代碼,會(huì)出現(xiàn)什么結(jié)果呢?
- var jsonStr = Sys.Serialization.JavaScriptSerializer.serialize(new Date());
得到的結(jié)果類似于是“"@1162814090119@"”,請(qǐng)注意兩邊還有雙引號(hào)。這個(gè)是一個(gè)ASP.NET AJAX對(duì)于Date對(duì)象比較特殊的表示方法,如果在某些時(shí)候開發(fā)人員需要自己來“拼接”字符串時(shí),就需要注意這一點(diǎn)。
給ASP.NET AJAX客戶端帶來反序列化能力的就是Sys.Serialization.JavaScriptSerializer類的deserialize靜態(tài)方法。如下:
- var obj = Sys.Serialization.JavaScriptSerializer.deserialize(jsonStr);
它事實(shí)上只是簡單地調(diào)用了 JavaScript內(nèi)置的eval方法。當(dāng)然,既然序列化時(shí)對(duì)于Date對(duì)象有特殊的表示方法,在反序列化時(shí),也會(huì)考慮到這一點(diǎn): Sys.Serialization.JavaScriptSerializer類的deserialize靜態(tài)方法在調(diào)用Evail之前,會(huì)把 “"@...@"”變成“new Date(...)”的形式,這就是標(biāo)準(zhǔn)的JSON字符串了。
二、JavaScriptTypeResolver與JavaScriptConverter:
客戶端的序列化和反序列化非常簡單,我把它放在這里一并說明更像是為了讓內(nèi)容更加完整。而服務(wù)器端的序列化與反序列化就不是那么輕易的了,它涉及到大量的字符串操作,也涉及到一定的自定義能力。這才是這片文章想要著重說明的。
ASP.NET AJAX提供的序列化和反序列化能力都是由Microsoft.Web.Script.Serialization這個(gè)命名空間下的類完成的。不過幸運(yùn)的是,他們大都是內(nèi)部類,真正能夠給開發(fā)人員使用的只有JavaScriptSerializer類的數(shù)個(gè)方法而已。ASP.NET AJAX已經(jīng)帶給我們比較充足的序列化與反序列化的能力,我們只需要掌握它,知道它們是如何工作的,那一般也就足夠了。
不過要進(jìn)入對(duì)于這些序列化與反序列化能力的了解,首先需要了解其它的兩個(gè)類:JavaScriptTypeResolver和JavaScriptConverter。
1、JavaScriptTypeResolver
JavaScriptTypeResolver是一個(gè)抽象類,雖然是***次在Atlas多個(gè)Release中出現(xiàn),但是它并不是一個(gè)新鮮事物。它的作用就相當(dāng)于Atlas CTP中的IJavaScriptSerializeContext接口,甚至可以說只是換了類名和方法名(事實(shí)上,從一個(gè)接口轉(zhuǎn)變?yōu)橐粋€(gè)抽象類,這個(gè)做法讓人摸不著頭腦,因?yàn)楝F(xiàn)在的抽象類也不存在任何的實(shí)現(xiàn))。這個(gè)類的作用是“將一個(gè)字符串,與一個(gè)特定的類進(jìn)行關(guān)聯(lián),使字符串成為那個(gè)特定類的一個(gè)標(biāo)識(shí) ”。這個(gè)抽象類存在著兩個(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è)類的作用還不是非常了解的話,那么可以看一下 ASP.NET AJAX中這個(gè)抽象類的一個(gè)簡單實(shí)現(xiàn)。那就是 Microsoft.Web.Script.Serialization.SimpleTypeResolver類。它的代碼如下:
- public sealed class SimpleTypeResolver : JavaScriptTypeResolver
- {
- public override Type ResolveType(string id)
- {
- return Type.GetType(id);
- }
- public override string ResolveTypeId(Type type)
- {
- if (type == null)
- {
- throw new ArgumentNullException("type");
- }
- return type.AssemblyQualifiedName;
- }
- }
以上介紹ASP.NET AJAX客戶端
【編輯推薦】