新聞中心
有時(shí)候在Web Service中會(huì)需要使用到比較復(fù)雜的類(lèi)型,它們的特征往往都是含用循環(huán)引用,這樣的對(duì)象如果交給ASP.NET AJAX中默認(rèn)的序列化方式來(lái)處理則會(huì)拋出異常,大家經(jīng)常遇到的“DataTable”問(wèn)題正是由此引起的。關(guān)于這一點(diǎn),ASP.NET AJAX自然提供了解決方法,在這里“官方”的解決方案就是JavaScriptConverter,它可以讓開(kāi)發(fā)人員自定義特定類(lèi)型的序列化能力。

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的中山網(wǎng)站建設(shè)公司,中山接單;提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行中山網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
事實(shí)上,需要自定義JavaScriptConverter的類(lèi)型不止“含有循環(huán)引用”的類(lèi)型,事實(shí)上,JavaScriptConverter的目標(biāo)是“ASP.NET AJAX中無(wú)法操作,或者結(jié)果不是開(kāi)發(fā)人員所期望那樣”的類(lèi)型,這里的“操作”包括“序列化”于“反序列化”兩部分。再舉個(gè)例子:如果一個(gè)類(lèi)型沒(méi)有無(wú)參數(shù)的構(gòu)造函數(shù),那么也需要定義JavaScriptConverter,否則ASP.NET AJAX無(wú)法對(duì)其進(jìn)行反序列化操作。
那么我們就通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看一下應(yīng)該如何開(kāi)發(fā)和使用JavaScriptConverter吧。
1、定義存在循環(huán)引用的類(lèi)型
首先我們定義一個(gè)Boy類(lèi)和Girl類(lèi)以供使用:
- public class Boy
- {
- public string Name;
- public Girl GirlFriend;
- }
- public class Girl
- {
- public string Name;
- public Boy BoyFriend;
- }
很顯然,如果我將它們“配成一對(duì)”,在序列化輸出時(shí)就會(huì)拋出異常了。就沖著這點(diǎn),我們就必須定義一個(gè)JavaScriptConverter啊,總不能拆散他倆。
2、定義JavaScriptConverter以及序列化能力
我們下面就該開(kāi)始定義JavaScriptConverter了,我們姑且將其稱(chēng)之為BoyConverter。首先需要告訴ASP.NET,我們這個(gè)Converter可以支持哪些類(lèi)型:
- public class BoyConverter : JavaScriptConverter
- {
- public override IEnumerable
SupportedTypes - {
- get
- {
- yield return typeof(Boy);
- }
- }
- ……
- }
如果要實(shí)現(xiàn)一個(gè)比較良好的Serialize方法,就需要處理“有循環(huán)引用”和“沒(méi)有循環(huán)引用”兩種情況。幸運(yùn)的是,對(duì)于Serialize方法來(lái)說(shuō),這點(diǎn)比較容易:
- public override IDictionary
, object> Serialize(object obj,
JavaScriptSerializer serializer)- {
- IDictionary
, object> result = new Dictionary , object>(); - Boy boy = (Boy)obj;
- result["Name"] = boy.Name;
- // 如果有GirlFriend引用
- if (boy.GirlFriend != null)
- {
- // 摘除循環(huán)引用
- boy.GirlFriend.BoyFriend = null;
- result["GirlFriend"] = boy.GirlFriend;
- // 在客戶(hù)端再建立關(guān)聯(lián)
- result["__getRealObject"] =
- "function(o) { oo.GirlFriend.BoyFriend = o; return o; }";
- }
- return result;
- }
在這里,我們“手動(dòng)”地將Boy對(duì)象轉(zhuǎn)換為了一個(gè)IDictionary
3、自定義序列化功能使用示例
那么我們來(lái)看一下使用示例吧,首先我們需要定義一個(gè)Web Service方法:
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- [Microsoft.Web.Script.Services.ScriptService]
- public class BoyGirlService : System.Web.Services.WebService {
- [WebMethod]
- public Boy GetBoy(string boyName, string girlName)
- {
- Boy boy = new Boy();
- boy.Name = boyName;
- if (!String.IsNullOrEmpty(girlName))
- {
- Girl girl = new Girl();
- girl.Name = girlName;
- girl.BoyFriend = boy;
- boy.GirlFriend = girl;
- }
- return boy;
- }
- }
以上介紹在ASP.NET中定義JavaScriptConverter
【編輯推薦】
- ASP.NET中的WebRequestExecutor
- IIS6的ASP.NET ISAPI請(qǐng)求處理過(guò)程
- ASP.NET中的備份
- 淺談ASP.NET ISAPI
- ASP.NET的IIS ISAPI extension
本文名稱(chēng):ASP.NET中定義JavaScriptConverter
地址分享:http://m.5511xx.com/article/dheocgc.html


咨詢(xún)
建站咨詢(xún)
