詳數(shù)JSON數(shù)據(jù)類型的使用于說明技巧
首先需要注意的是,如果嵌套的對象數(shù)目大于JSON數(shù)據(jù)類型中所定義的值100的話,序列化過程將會失敗。顯然,如果序列化后的字符串的長度超出MaxJsonLength屬性所定義的值0x200000(即十進(jìn)制的2,097,152)的話,序列化過程也會失敗。
此外,通過上面代碼也可以看出,對象將被序列化為一個StringBuilder對象,***返回相應(yīng)的字符串?dāng)?shù)據(jù)。其實,主要的工作是在私有方法SerializeValue()中完成的。在我們討論這個方法之前,首先注意到,JavaScriptSerializer對象使用了JavaScriptTypeResolver對象。#t#
這個JavaScript類型解析器負(fù)責(zé)實現(xiàn)在字符串類型與其他類型之間的相互轉(zhuǎn)換;當(dāng)序列化定制對象時這一功能是非常重要的。還應(yīng)注意的是,__type屬性將被包含于JSON數(shù)據(jù)類型中,以便標(biāo)識對象的類型。之后,客戶端會把JSON數(shù)據(jù)類型為原始的對象形式。
JavaScriptTypeResolver對象包括兩個public類型的方法,一個負(fù)責(zé)把原始類型解析為字符串類型,另一個則負(fù)責(zé)把字符串解析為原始類型。這個類的原型定義如下所示:
- public abstract class JavaScriptTypeResolver
- {
- //方法
- protected JavaScriptTypeResolver();
- public abstract Type ResolveType(string id);
- public abstract string ResolveTypeId(Type type);
- }
顯然,上面這個JavaScriptTypeResolver類是一個抽象基類;因此,必須通過其他對象進(jìn)一步派生使用,從而最終實現(xiàn)在原始類型與字符串之間的相應(yīng)解析。現(xiàn)在,我們可以使用的對象是SimpleTypeResolver,而且JSON數(shù)據(jù)類型也正好實現(xiàn)了上面所要求實現(xiàn)的方法—使用System.Type對象實現(xiàn)字符串描述形式與原始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對象,因為內(nèi)置的序列化過程無法實現(xiàn)對于所有可用數(shù)據(jù)類型的序列化。在這種情況下,可以從抽象基類JavaScriptConverter對象派生一個子類,由它來實現(xiàn)特定類型數(shù)據(jù)的序列/反序列化。
可以使用JavaScriptSerializer對象的RegisterConverters()方法注冊一個轉(zhuǎn)換器對象。此方法把所有的轉(zhuǎn)換器對象存儲在一個Dictionary對象中;針對多種不同的數(shù)據(jù)類型的轉(zhuǎn)換器經(jīng)注冊后都會存儲在此字典對象中。概括來看,這個Dictionary對象被定義如表格1所示的一些JSON數(shù)據(jù)類型。