ASP.NET AJAX循环引用的类型

开发 后端
本文介绍ASP.NET AJAX循环引用的类型,在这里“官方”的解决方案就是JavaScriptConverter,它可以让开发人员自定义特定类型的序列化能力。

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

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

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

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

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

public class Boy  
{  
public string Name;  
public Girl GirlFriend;  
}  
public class Girl  
{  
public string Name;  
public Boy BoyFriend;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.


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


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

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

public class BoyConverter : JavaScriptConverter  
{  
public override IEnumerable<Type> SupportedTypes  
{  
get  
{  
yield return typeof(Boy);  
}  
}  
……  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.


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

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

以上介绍ASP.NET AJAX循环引用的类型

【编辑推荐】

  1. ASP.NET MVC Web应用程序工程
  2. IIS6的ASP.NET ISAPI请求处理过程
  3. ASP.NET控件的七种用户管理相关控件
  4. 对ASP.Net进行RSA加密
  5. ASP.NET得到数据库字符串的方法
责任编辑:佚名 来源: cnblogs
相关推荐

2009-07-22 16:05:34

ASP.NET AJA

2009-07-24 13:41:15

ASP.NET AJA

2009-07-22 16:11:43

ASP.NET AJA

2009-07-22 16:17:39

ASP.NET AJA

2009-07-22 16:25:41

ASP.NET AJA

2009-07-20 17:39:36

WCF服务ASP.NET AJA

2009-07-20 13:14:25

安装ASP.NET A

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-07-20 10:16:13

配置ASP.NET A

2009-07-22 15:58:52

ASP.NET AJA

2009-07-31 13:24:43

ASP.NET AJA

2009-07-28 09:02:32

asp.net aja

2009-07-24 13:08:40

AJAX技术ASP.NET

2009-07-27 09:07:04

Profile SerASP.NET AJA

2009-07-21 09:53:55

ASP.NET AJAWCF服务

2009-07-20 17:59:07

JavaScript调ASP.NET AJA

2009-07-20 13:54:31

ScriptManagASP.NET AJA

2009-08-07 16:09:25

ASP.NET AJA

2009-07-21 17:18:26

UpdateProgrASP.NET AJA

2009-07-29 15:53:22

ASP.NET AJA
点赞
收藏

51CTO技术栈公众号