Asp.Net JSON序號與還原序列化

來源:互聯網
上載者:User

標籤:

問題的引子先來看問題的引子。定義一個下面這樣的類,此類有Serializable屬性,並且有一個屬性的定義沒有使用自動屬性來實現。[Serializable] public class Users {     public int UserID { get; set; }     public string UserName { get; set; }     public string UserEmail { get; set; }     private string _testProperty;     public string TestProperty     {         get { return _testProperty; }         set { _testProperty = value; }     } }然後分別使用DataContractJsonSerializer和JavaScriptSerializer對此對象的樣本進行序列化。使用DataContractJsonSerializer序列化後的結果。{"_testProperty":"TestPropertyValue","<UserEmail>k__BackingField":"[email protected]","<UserID>k__BackingField":1,"<UserName>k__BackingField":"Parry"}使用JavaScriptSerializer序列化後的結果。{"UserID":1,"UserName":"Parry","UserEmail":"[email protected]","TestProperty":"TestPropertyValue"}DataContractJsonSerializer和JavaScriptSerializer的實現差異DataContractJsonSerializer在.NET Framework 3.5中引入,主要因為WCF的引入而添加了這個對象序列化的基本方法,並且微軟同時將JavaScriptSerializer打上了過時(obsolete)的標籤,編譯時間就會有警告出現。而在.NET Framework 3.5 SP1中,又將JavaScriptSerializer的“過時”標籤給去掉了。使用Reflector去比較這兩個類的內部實現發現,DataContractJsonSerializer在對象序列化時進行了更為嚴格的檢查,感興趣的可以去System.Runtime.Serialization.Json下面的核心方法InternalWriteObjectContent去看其實現。而在.NET Framework 3.5引入的自動屬性,實際上就是個文法糖,編譯器還是會產生一個int類型的<Name>k_BackingField的私人欄位作為這個屬性的後端欄位,內部還是和以前的get/set方法一樣。所以直接使用DataContractJsonSerializer進行序列化時,有將編譯器產生的k_BackingField帶了出來。而JavaScriptSerializer的實現則非常的簡單,將屬性名稱和屬性值分別儲存在Dictionary裡,然後進行字串拼接返回而已,所以對類幾乎沒有檢查並且對複雜類的支援不太好。下面是JavaScriptSerializer裡面的核心方法SerializeValue的實現。private void SerializeValue(object o, StringBuilder sb, int depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember = null) {     if (++depth > _recursionLimit) {          throw new ArgumentException(AtlasWeb.JSON_DepthLimitExceeded);      }     // Check whether a custom converter is available for this type.     JavaScriptConverter converter = null;     if (o != null && ConverterExistsForType(o.GetType(), out converter)) {         IDictionary<string, object> dict = converter.Serialize(o, this);          if (TypeResolver != null) {              string typeString = TypeResolver.ResolveTypeId(o.GetType());              if (typeString != null) {                 dict[ServerTypeFieldName] = typeString;              }         }         sb.Append(Serialize(dict, serializationFormat));          return;     }      SerializeValueInternal(o, sb, depth, objectsInUse, serializationFormat, currentMember); }解決方案:如果一定要使用DataContractJsonSerializer,只有當為類加上[DataContract]屬性,並且為需要序列化的屬性加上[DataMember]後,使用DataContractJsonSerializer才可以產生乾淨、整潔的JSON資料。而當我們使用一些不能修改的類定義,如上面的Users類定義,我們沒有許可權去修改其定義,那麼就可以使用JavaScriptSerializer去進行JSON序列化。當然第三方的Json.NET(Newtonsoft.Json)也是可以實現了,並且在支援的功能和效率方面往往是一個更好的選擇,在這裡看它和DataContractJsonSerializer以及JavaScriptSerializer的對比。所以在使用時需要稍微注意下這三個JSON序列化方法的差異,根據自己的需求靈活選擇合適的組件。

  

 

http://www.cnblogs.com/freshman0216/p/4161800.html

Asp.Net JSON序號與還原序列化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.