日期:2014-05-16  浏览次数:20787 次

给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化

    Ajax最强悍的功能莫过于服务器和客户端之间的异步交互,他们在交互的时候不是通过soap协议等,而是通过回调函数,以Json的格式传送数据。

    由于Json格式的限制,在很多情况下,稍微复杂一些的数据往往会引起循环引用的错误,至于什么是循环引用?什么时候会发生循环引用?这里不再赘述,详见上篇博客

    都在强调Ajax的强大,那么就举这么一个例子:自定义一个复杂类型的数据,一个男孩类和一个女孩类互为对象,在客户端访问的时候就会出现循环引用,初学的我们或许会感叹:Ajax也不过如此嘛!其实不然,Ajax早已做好了解决这个问题的方法,那就是——序列化和反序列化!个人觉得它就好比一副穿在Json数据格式上的漂亮嫁衣,让程序猿们对Ajax青睐有嘉……

           

    上一篇博客中总结了微软已经为常用的dt家族(datatable、dataset、datarow)的序列化和反序列化的封装;这里让我们为自定义的数据类型定制一套自己的嫁衣吧!

   

   

    首先我们需要考虑这么几个问题:怎么来序列化和反序列化?什么时候需要序列化和反序列化?接下来就让每一个步代码来解释这些问题,希望看完这篇文章这几个问题可以迎刃而解。

 

==============================================================================================================================================================================

 

 

一、材料准备——循环引用的两个类的定

 

    1、在服务端App_Code目录下添加ComplexType文件夹下创建BoyAndGirl.cs类文件。

 

   

    在BoyAndGirl.cs类文件中添加如下代码,定义Boy和Girl类,并指定可以相互访问。

   

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace ComplexType
{
	
    // 如果一个类型没有无参数的构造函数,那么也需要定义JavaScriptConverter,否则ASP.NET AJAX无法对其进行反序列化操作。
	public class Boy
	{
		public string Name;

		public Girl  GirlFriend;
	}

    
	public class Girl
	{
		public string Name;

		public Boy BoyFriend;
	}
}


   

    2、添加BoyGirlService.asmx服务,并在服务中创建Boy类和Girl类的循环引用。

   

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using ComplexType;
using System.Diagnostics;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class BoyGirlService  : System.Web.Services.WebService {

    [WebMethod]
    //建立循环引用
    public Boy GetBoyWithGirlFriend()
	{
		Boy boy = new Boy();
		boy.Name = "Terry";
		
		Girl girl = new Girl();
		girl.Name = "Marry";

		boy.GirlFriend = girl;
		girl.BoyFriend = boy;