ASP.NET中定义JavaScriptConverter

开发 后端
本文介绍ASP.NET中定义JavaScriptConverter,通过一个简单的例子来看一下应该如何开发和使用JavaScriptConverter。

有时候在Web Service中会需要使用到比较复杂的类型,它们的特征往往都是含用循环引用,这样的对象如果交给ASP.NET AJAX中默认的序列化方式来处理则会抛出异常,大家经常遇到的“DataTable”问题正是由此引起的。关于这一点,ASP.NET AJAX自然提供了解决方法,在这里“官方”的解决方案就是JavaScriptConverter,它可以让开发人员自定义特定类型的序列化能力。

事实上,需要自定义JavaScriptConverter的类型不止“含有循环引用”的类型,事实上,JavaScriptConverter的目标是“ASP.NET AJAX中无法操作,或者结果不是开发人员所期望那样”的类型,这里的“操作”包括“序列化”于“反序列化”两部分。再举个例子:如果一个类型没有无参数的构造函数,那么也需要定义JavaScriptConverter,否则ASP.NET AJAX无法对其进行反序列化操作。

那么我们就通过一个简单的例子来看一下应该如何开发和使用JavaScriptConverter吧。

1、定义存在循环引用的类型

首先我们定义一个Boy类和Girl类以供使用:

  1. public class Boy  
  2. {  
  3. public string Name;  
  4. public Girl GirlFriend;  
  5. }  
  6. public class Girl  
  7. {  
  8. public string Name;  
  9. public Boy BoyFriend;  

很显然,如果我将它们“配成一对”,在序列化输出时就会抛出异常了。就冲着这点,我们就必须定义一个JavaScriptConverter啊,总不能拆散他俩。


2、定义JavaScriptConverter以及序列化能力

我们下面就该开始定义JavaScriptConverter了,我们姑且将其称之为BoyConverter。首先需要告诉ASP.NET,我们这个Converter可以支持哪些类型:

  1. public class BoyConverter : JavaScriptConverter  
  2. {  
  3. public override IEnumerable<Type> SupportedTypes  
  4. {  
  5. get  
  6. {  
  7. yield return typeof(Boy);  
  8. }  
  9. }  
  10. ……  

如果要实现一个比较良好的Serialize方法,就需要处理“有循环引用”和“没有循环引用”两种情况。幸运的是,对于Serialize方法来说,这点比较容易:

  1. public override IDictionary<string, object> Serialize(object obj, 
    JavaScriptSerializer serializer)  
  2. {  
  3. IDictionary<string, object> result = new Dictionary<string, object>();  
  4. Boy boy = (Boy)obj;  
  5. result["Name"] = boy.Name;  
  6. // 如果有GirlFriend引用  
  7.     if (boy.GirlFriend != null)  
  8. {  
  9. // 摘除循环引用  
  10.         boy.GirlFriend.BoyFriend = null;  
  11. result["GirlFriend"] = boy.GirlFriend;  
  12. // 在客户端再建立关联  
  13.         result["__getRealObject"] =  
  14. "function(o) { oo.GirlFriend.BoyFriend = o; return o; }";  
  15. }  
  16. return result;  

在这里,我们“手动”地将Boy对象转换为了一个IDictionary<string, objct>,这样就避免出现了循环引用。另外,为了在客户端直接得到一个互相引用的“Boy”和“Girl”对象,我在这里使用了我在前一片文章中提到的扩展,具体请见《深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型》。


3、自定义序列化功能使用示例

那么我们来看一下使用示例吧,首先我们需要定义一个Web Service方法:

  1. [WebService(Namespace = "http://tempuri.org/")]  
  2. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  3. [Microsoft.Web.Script.Services.ScriptService]  
  4. public class BoyGirlService  : System.Web.Services.WebService {  
  5. [WebMethod]  
  6. public Boy GetBoy(string boyName, string girlName)  
  7. {  
  8. Boy boy = new Boy();  
  9. boy.Name = boyName;  
  10. if (!String.IsNullOrEmpty(girlName))  
  11. {  
  12. Girl girl = new Girl();  
  13. girl.Name = girlName;  
  14. girl.BoyFriend = boy;  
  15. boy.GirlFriend = girl;  
  16. }  
  17. return boy;  
  18. }  

以上介绍在ASP.NET中定义JavaScriptConverter

【编辑推荐】

  1. ASP.NET中的WebRequestExecutor
  2. IIS6的ASP.NET ISAPI请求处理过程
  3. ASP.NET中的备份
  4. 浅谈ASP.NET ISAPI
  5. ASP.NET的IIS ISAPI extension
责任编辑:佚名 来源: IT168
相关推荐

2012-05-04 15:54:16

ASP.NET

2009-07-22 17:45:35

ASP.NET教程

2009-08-03 14:22:33

什么是ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2009-07-27 15:25:40

aspx页面ASP.NET

2009-07-24 10:10:22

ASP.NET

2009-07-24 16:17:42

WebRequestEASP.NET

2009-07-21 11:11:44

删除CookieASP.NET

2009-08-04 12:29:57

ViewState概念ASP.NET

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入门教程

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计

2009-07-27 13:01:28

TreeViewASP.NET

2009-07-21 17:18:26

UpdateProgrASP.NET AJA

2009-07-22 17:55:52

2009-07-20 16:56:16

SQL语句ASP.NET

2009-07-20 17:21:43

Session状态ASP.NET

2011-06-08 11:36:16

ASP.NETrender

2009-07-31 09:58:20

URL映射ASP.NET

2009-08-04 17:20:37

PostBack和ViASP.NET

2009-08-04 17:30:23

cookieless属ASP.NET
点赞
收藏

51CTO技术栈公众号