本文是Converter,自定义JavaScriptConverter以及序列化等内容.

四、使用JavaScriptVonverter
      使用JavaScriptConverter的作用就是返回一个复杂类型,但可能会出现“循环引用”的错误。那我们该怎么解决呢,一种方式是我们可以采用自定义数据类型来封装复杂类型;通过使用web.config,在web.config里定义Converter.

    我们还是分析示例吧,定义一个DataTableWebService.asmx,提供一个方法返回一个DataTable对象:
 1客户端访问Web Service--参数类型的序列化与反序列化(二)[WebMethod]
 2客户端访问Web Service--参数类型的序列化与反序列化(二)public DataTable GetDataTable()
 3客户端访问Web Service--参数类型的序列化与反序列化(二){
 4客户端访问Web Service--参数类型的序列化与反序列化(二)   DataTable dt = new DataTable();
 5客户端访问Web Service--参数类型的序列化与反序列化(二)   dt.Columns.Add(new DataColumn("ID", typeof(int)));
 6客户端访问Web Service--参数类型的序列化与反序列化(二)   dt.Columns.Add(new DataColumn("Text", typeof(string)));
 7客户端访问Web Service--参数类型的序列化与反序列化(二)
 8客户端访问Web Service--参数类型的序列化与反序列化(二)   Random random = new Random(DateTime.Now.Millisecond);
 9客户端访问Web Service--参数类型的序列化与反序列化(二)   for (int i = 0; i < 10; i++)
10客户端访问Web Service--参数类型的序列化与反序列化(二)   {
11客户端访问Web Service--参数类型的序列化与反序列化(二)        dt.Rows.Add(i, random.Next().ToString());
12客户端访问Web Service--参数类型的序列化与反序列化(二)   }
13客户端访问Web Service--参数类型的序列化与反序列化(二)
14客户端访问Web Service--参数类型的序列化与反序列化(二)   return dt;
15客户端访问Web Service--参数类型的序列化与反序列化(二)}
   
   新建一个aspx页面来调用这个WebService所提供的方法:
 1客户端访问Web Service--参数类型的序列化与反序列化(二)<script type="text/javascript">
 2客户端访问Web Service--参数类型的序列化与反序列化(二)function getDataTable()
 3客户端访问Web Service--参数类型的序列化与反序列化(二){
 4客户端访问Web Service--参数类型的序列化与反序列化(二)        DataTableWebService.GetDataTable(onSucceeded,onFailed);
 5客户端访问Web Service--参数类型的序列化与反序列化(二)}
 6客户端访问Web Service--参数类型的序列化与反序列化(二)     
 7客户端访问Web Service--参数类型的序列化与反序列化(二)//成功时候的回调函数
 8客户端访问Web Service--参数类型的序列化与反序列化(二)function onSucceeded(result)
 9客户端访问Web Service--参数类型的序列化与反序列化(二){
10客户端访问Web Service--参数类型的序列化与反序列化(二)   alert(result);
11客户端访问Web Service--参数类型的序列化与反序列化(二)}
12客户端访问Web Service--参数类型的序列化与反序列化(二)    
13客户端访问Web Service--参数类型的序列化与反序列化(二)//失败时候的回调函数
14客户端访问Web Service--参数类型的序列化与反序列化(二)function onFailed(error)
15客户端访问Web Service--参数类型的序列化与反序列化(二){
16客户端访问Web Service--参数类型的序列化与反序列化(二)    alert(error.get_message());
17客户端访问Web Service--参数类型的序列化与反序列化(二)}
18客户端访问Web Service--参数类型的序列化与反序列化(二)</script>

    我们提供一个失败时候的回掉函数,当调用失败我们就把错误信息给提示出来。这样在页面调用就会发生一个错误。我们通过一个按扭来调用,当点击按扭的时候就调用getDataTable()方法,运行结果会alert出一个错误,如下图:
                客户端访问Web Service--参数类型的序列化与反序列化(二)      
      是什么原因造成这个错误的呢?这个错误提示信息的表示:“在序列化这个类型(DataTable)的时候发生了一个程循环的引用”。也就是说,因为有循环的引用,我们不能简单的将这个对象序列化。那么我们该怎么做呢。我们可以通过ASP.NET AJAX ctp组件提供的一个动态库("Microsoft.Web.Preview.dll”)来处理,这里我们需将其引入项目中。他指定了一些转换DataSet,DataTable,DataRow的类型。使用他我们需要在Web.config的WebService节点中添加相宜的配置。
1客户端访问Web Service--参数类型的序列化与反序列化(二)<jsonSerialization>
2客户端访问Web Service--参数类型的序列化与反序列化(二) <converters>
3客户端访问Web Service--参数类型的序列化与反序列化(二)  <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview" />
4客户端访问Web Service--参数类型的序列化与反序列化(二)  <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview" />
5客户端访问Web Service--参数类型的序列化与反序列化(二)  <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview" />
6客户端访问Web Service--参数类型的序列化与反序列化(二) </converters>
7 </jsonSerialization>
   
      通过这样的配置后,我们就可以正确的转换了。WebService返回了一个DataTable对象。客户端接收到result里。下面我们通过拼接字符串的形式来动态的构造一个表格在页面上呈现出来:
 1客户端访问Web Service--参数类型的序列化与反序列化(二)var sb = new Sys.StringBuilder("<table border='1'>");
 2客户端访问Web Service--参数类型的序列化与反序列化(二)sb.append("<tr><td>ID</td><td>Text</td></tr>");
 3客户端访问Web Service--参数类型的序列化与反序列化(二)for (var i = 0; i < result.rows.length; i++)
 4客户端访问Web Service--参数类型的序列化与反序列化(二){
 5客户端访问Web Service--参数类型的序列化与反序列化(二)    sb.append(
 6客户端访问Web Service--参数类型的序列化与反序列化(二)    String.format(            "<tr><td>{0}</td><td>{1}</td></tr>",    result.rows[i]["ID"],
 7客户端访问Web Service--参数类型的序列化与反序列化(二)    result.rows[i].Text));
 8客户端访问Web Service--参数类型的序列化与反序列化(二)}
 9客户端访问Web Service--参数类型的序列化与反序列化(二)sb.append("</table>");
10客户端访问Web Service--参数类型的序列化与反序列化(二)$get("result").innerHTML = sb.toString();
     这就是JavaScriptConverter的用法,下面是运行结果图:
   客户端访问Web Service--参数类型的序列化与反序列化(二)
五、自定义JavaScriptConverter
     往往我们在使用JavaScriptConverter的时候,我们可能会自定义一个负责的类型,那么在序列化的时候也可能会出现循环引用的情况,处于这种情况我们就可以自己定义一个JavaScriptConverter。那么我们该如何定义这个JavaScriptConverter呢?JavaScriptConverter的作用就是处理循环引用,简化默认的复杂序列化和反序列化的行为。我们首先先定义两个负责的类型:
 1客户端访问Web Service--参数类型的序列化与反序列化(二)public class Boy
 2}

    定义JavaScriptConverter我们需定义一个类继承JavaScriptConverter类,并实现SupportedTypes及Serialize方法用于序列化复杂数据;实现SupportenTypes:
1客户端访问Web Service--参数类型的序列化与反序列化(二)public override IEnumerable<Type> SupportedTypes
2}

实现Serialize用户序列化复杂数据:
 1客户端访问Web Service--参数类型的序列化与反序列化(二) public override IDictionary<stringobject> Serialize(object obj, JavaScriptSerializer serializer)
 2}

实现Deserialize方法用于反序列化复杂数据:
 1客户端访问Web Service--参数类型的序列化与反序列化(二)public override object Deserialize(IDictionary<stringobject> dictionary, 
 2客户端访问Web Service--参数类型的序列化与反序列化(二)        Type type, JavaScriptSerializer serializer)
 3}

     到这里我们自定义的JavaScriptConverter就算是万事具备,只欠东风了。这东风从何起呢?我们已经定义好了JavaScriptConverter,最后一步就是需要在web.config里注册该JavaScriptConverter。
客户端访问Web Service--参数类型的序列化与反序列化(二)<add name="BoyConverter" type="BoyConverter, App_Code" />
    
     接下来我们来看看我们怎么来使用自定义的这个JavaScriptConverter,客户端代码:
 1客户端访问Web Service--参数类型的序列化与反序列化(二)<script language="javascript" type="text/javascript">
 2客户端访问Web Service--参数类型的序列化与反序列化(二)function getBoy()
 3script>

    同样我们还是通过按扭来实现调用,当点击按纽的时候就得到复杂数据或是设置数据。
1客户端访问Web Service--参数类型的序列化与反序列化(二)<input type="button" value="Get Boy" onclick="getBoy()" />
2客户端访问Web Service--参数类型的序列化与反序列化(二)<input type="button" value="Set Boy" onclick="setBoy()" />


   下面是运行后的效果:
                         客户端访问Web Service--参数类型的序列化与反序列化(二)

示例代码下载:ClientWebService.rar

------------------------------------------------------------------------------------------------------------

相关文章:

  • 2022-12-23
  • 2021-12-25
  • 2021-10-05
  • 2021-10-28
猜你喜欢
  • 2021-07-07
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
  • 2021-07-26
  • 2021-05-21
  • 2021-09-21
相关资源
相似解决方案