首先需要注意的是,如果嵌套的對象數目大於JSON數據類型中所定義的值100的話,序列化過程將會失敗。顯然,如果序列化後的字符串的長度超出MaxJSonLength屬性所定義的值0x200000(即十進制的2,097,152)的話,序列化過程也會失敗。
此外,通過上面代碼也可以看出,對象將被序列化為一個StringBuilder對象,最後返回相應的字符串數據。其實,主要的工作是在私有方法SerializeValue()中完成的。在我們討論這個方法之前,首先注意到,JavascriptSerializer對象使用了JavaScriptTypeResolver對象。
這個JavaScript類型解析器負責實現在字符串類型與其他類型之間的相互轉換;當序列化定制對象時這一功能是非常重要的。還應注意的是,__type屬性將被包含於JSON數據類型中,以便標識對象的類型。之後,客戶端會把JSON數據類型為原始的對象形式。
JavaScriptTypeResolver對象包括兩個public類型的方法,一個負責把原始類型解析為字符串類型,另一個則負責把字符串解析為原始類型。這個類的原型定義如下所示:
- public abstract class JavaScriptTypeResolver
- {
- //方法
- protected JavaScriptTypeResolver();
- public abstract Type ResolveType(string id);
- public abstract string ResolveTypeId(Type type);
- }
顯然,上面這個JavaScriptTypeResolver類是一個抽象基類;因此,必須通過其他對象進一步派生使用,從而最終實現在原始類型與字符串之間的相應解析。現在,我們可以使用的對象是SimpleTypeResolver,而且JSON數據類型也正好實現了上面所要求實現的方法—使用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所示的一些JSON數據類型。