1、使用复杂参数或返回值
- 作为参数的类型一定要有默认的构造函数,就是说要有无参的构造函数。
- 客户端使用的类型必须要和服务端的类型共有域变量及属性,注:设置的属性必须要有Setter方法。客户端使用服务端的复杂类型有两种方式构造一个对象。1是使用JSon字符串的形势,设置一个变量,让它的值类似与{"名称1":值1, "名称2":值2}这种方式,名称1,名称2,要与服务段公有的字段相同。
var color = ...{"Red" : 50, "Green" : 100, "Blue" : 200};
var color = new ComplexType.Color();
color.Red = 50;
color.Green = 100;
color.Blue = 200;
- 在客户端和服务段传递对象时自动进行(JSon)序列化与反序列化。
- 生成复杂对象代理时,需要在服务端使用GenerateScriptType属性标记要代理的类[GenerateScriptType(typeof(Color))]注:此标记可以标记在类、接口以及方法上
- 如果服务器端类型有基类、派生类等继承关系,当然可以根据具体的情况生成具体的派生类对象,还可以直接实例化一个Object对象,设置这个对象__type属性,在把这个对象传递到服务端时,服务端可根据此标记自动反序列化为一个派生类,这样可以实现一个多态的效果,这个Object对象就是基类的对象,根据__type属性自动实例化一个派生类
2、使用JavaScriptConverter
JavaScriptConverter可以用来处理存在循环引用的类和结果不是开发人员所期望那样的类型,如一个类型没有无参的构造函数,那么是否就不能在客户端使用了?使用JavaScriptConverter就能够在客户端使用
使用DataTable这样的复杂类型时,可以使用JavaScriptConverter来解决













这是使用别人已经写好的JavaScriptConverter来使用DataSet,DataRow,DataTable数据类型。
3、自己编写JavaScriptConverter
自定义JavaScriptConverter需要继承JavaScriptConverter对象,并重写Deserialize、Serialize、SupportedTypes方法和属性


























































4、序列化和反序列化
- 客户端的反序列化:
Sys.Serialization.JavaScriptSerializer.deserialize('<%= this.SerializedDateTime %>');
- 服务端的序列化
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.Serialize(DateTime.Now);
- 上面是简单类型的序列化和反序列化,如果是复杂的对象类型需要用到JavaScriptTypeResolver
自定义一个Resolver类并继承JavaScriptTypeResolver类,重写ResolveType、ResolveTypeId两个方法
JavaScriptTypeResolver不是一个直接使用的类,他是用来辅助JavaScriptSerializer类的,作为构造函数的参数传入。namespace TypeResolver
...{
/**//// <summary>
/// Summary description for CustomizeTypeResolver
/// </summary>
public class CustomizeTypeResolver : JavaScriptTypeResolver
...{
//从字符串标识获取一个Type对象
public override Type ResolveType(string id)
...{
//id就是从客户端对象的__type的值
switch (id)
...{
case "0": return typeof(Intern);
case "1": return typeof(Vendor);
case "2": return typeof(FulltimeEmployee);
}
return null;
}
//得到Type对象的标识字符串
public override string ResolveTypeId(Type type)
...{
if (type == typeof(Intern))
...{
//返回客户端就是__type属性的值
return "0";
}
else if (type == typeof(Vendor))
...{
return "1";
}
else if (type == typeof(FulltimeEmployee))
...{
return "2";
}
return null;
}
}
}
Employee emp = null;
switch (id)
...{
case 0: emp = new Intern(); break;
case 1: emp = new Vendor(); break;
default: emp = new FulltimeEmployee(); break;
}
//用Resolver对象来实例一个JavaScriptSerializer对西那个
JavaScriptSerializer serializer = new JavaScriptSerializer(new CustomizeTypeResolver());
//序列化复杂对象
return serializer.Serialize(emp);