ASP.NET AJAX框架编程之JSON序列化剖析
2008-04-15 11:11:00 来源:天极网 作者:朱先忠 点击:
ASP.NET AJAX(最初代码名为“ATLAS”)框架,作为重点支持ASP.NET开发平台的开源Ajax框架在它一出世时就受到广大.NET开发人员的青睐。
nbsp;Type ResolveType(string id);
public abstract string ResolveTypeId(Type type);
}
显然,上面这个JavaScriptTypeResolver类是一个抽象基类;因此,必须通过其他对象进一步派生使用,从而最终实现在原始类型与字符串之间的相应解析。现在,我们可以使用的对象是SimpleTypeResolver,而且它也正好实现了上面所要求实现的方法—使用System.Type对象实现字符串描述形式与原始Type对象之间的相互解析。请看下面的例子:
public override Type ResolveType(string id)
{
return Type.GetType(id);
}
public override string ResolveTypeId(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return type.AssemblyQualifiedName;
}
最后,JavaScriptSerializer对象还有可能使用JavaScriptConverter对象,因为内置的序列化过程无法实现对于所有可用数据类型的序列化。在这种情况下,可以从抽象基类JavaScriptConverter对象派生一个子类,由它来实现特定类型数据的序列/反序列化。可以使用JavaScriptSerializer对象的RegisterConverters()方法注册一个转换器对象。此方法把所有的转换器对象存储在一个Dictionary对象中;针对多种不同的数据类型的转换器经注册后都会存储在此字典对象中。概括来看,这个Dictionary对象被定义如表格1所示的一些数据类型。
表1—可序列化的数据类型汇总
|
原始数据类型 |
被序列化后的形式 |
|
null或DBNull |
"null" |
|
string |
带引号的字符串 |
|
char |
如果是‘\0’则转换为"null";否则,序列化为带引号的字符串 |
|
bool |
"true"或"false" |
|
DateTime |
"\/Date(ticks since 12:00AM 1970/01/01 UTC)\/" |
|
Guid |
“string representation”: sb.Append("\"").Append(guid.ToString()).Append("\""); |
|
Uri |
sb.Append("\"").Append(uri.GetComponents(UriComponents.SerializationInfoString,UriFormat.UriEscaped)).Append("\""); |
|
double |
sb.Append(((double) o).ToString("r", CultureInfo.InvariantCulture)); |
|
float |
sb.Append(((float) o).ToString("r", CultureInfo.InvariantCulture)); |
|
primitive或decimal |
IConvertible convertible = o as IConvertible;
sb.Append(convertible.ToString(CultureInfo.InvariantCulture)); |
|
Enum |
sb.Append((int) o); |
|
IDictionary |
转换为JSON文本串,例如:
{"Key1":Value1,"Key2":Value2 ... } |
|
IEnumerable |
转换为JSON文本串,例如:
{"Key1":Value1,"Key2":Value2 ... } |