有时候在Web Service中会需要使用到比较复杂的类型,它们的特征往往都是含用循环引用,这样的对象如果交给ASP.NET AJAX中默认的序列化方式来处理则会抛出异常,大家经常遇到的“DataTable”问题正是由此引起的。关于这一点,ASP.NET AJAX自然提供了解决方法,在这里“官方”的解决方案就是JavaScriptConverter,它可以让开发人员自定义特定类型的序列化能力。
创新互联是专业的中山网站建设公司,中山接单;提供成都网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行中山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
事实上,需要自定义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;
- }
很显然,如果我将它们“配成一对”,在序列化输出时就会抛出异常了。就冲着这点,我们就必须定义一个JavaScriptConverter啊,总不能拆散他俩。
2、定义JavaScriptConverter以及序列化能力
我们下面就该开始定义JavaScriptConverter了,我们姑且将其称之为BoyConverter。首先需要告诉ASP.NET,我们这个Converter可以支持哪些类型:
- public class BoyConverter : JavaScriptConverter
- {
- public override IEnumerable
SupportedTypes - {
- get
- {
- yield return typeof(Boy);
- }
- }
- ……
- }
如果要实现一个比较良好的Serialize方法,就需要处理“有循环引用”和“没有循环引用”两种情况。幸运的是,对于Serialize方法来说,这点比较容易:
- 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)
- {
- // 摘除循环引用
- boy.GirlFriend.BoyFriend = null;
- result["GirlFriend"] = boy.GirlFriend;
- // 在客户端再建立关联
- result["__getRealObject"] =
- "function(o) { oo.GirlFriend.BoyFriend = o; return o; }";
- }
- return result;
- }
在这里,我们“手动”地将Boy对象转换为了一个IDictionary
3、自定义序列化功能使用示例
那么我们来看一下使用示例吧,首先我们需要定义一个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中定义JavaScriptConverter
文章来源:http://www.shufengxianlan.com/qtweb/news48/281748.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联