2011-01-23 67 views
3

我想盡可能簡單地將任何對象序列化爲JSON,然後簡單地將其轉換回type = safe對象。任何人都可以告訴我在「FromJSONString」擴展方法中我做錯了什麼?作爲擴展方法優化的JSON序列化器/反序列化器?

編輯

爲了您的方便,一個完整的,功能擴展方法如下。如果您看到錯誤,請告訴我。

 public static string ToJSONString(this object obj) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      var ser = new DataContractJsonSerializer(obj.GetType()); 

      ser.WriteObject(stream, obj); 

      return Encoding.UTF8.GetString(stream.ToArray()); 
     } 
    } 
    public static T FromJSONString<T>(this string obj) 
    { 
     using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj))) 
     { 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
      T ret = (T)ser.ReadObject(stream); 
      return ret; 
     } 
    } 

回答

2

在繼承對象的情況下,這不能按預期工作。

反序列化只返回基礎對象而不是序列化對象。如下更改序列化將解決此問題。

public static String ToJSONString(this Object obj) 
     { 
      using (var stream = new MemoryStream()) 
      { 
       var ser = new DataContractJsonSerializer(typeof(object)); 
       ser.WriteObject(stream, obj); 
       return Encoding.UTF8.GetString(stream.ToArray()); 
      } 
     } 
6

您必須提供JSON字符串到MemoryStream進行解碼。特別是,你必須改變:

MemoryStream stream1 = new MemoryStream(); 

實際檢索字符串字節:

MemoryStream stream1 = new MemoryStream(Encoding.UTF8.GetBytes(obj)) 

話雖這麼說,我也想確保做正確的內存清理和處置我的對象...同時,而不是使用StreamReader(也應該放置),只需將內存流重新編碼爲UTF-8字符串即可。請參閱下面的清理代碼。

public static String ToJSONString(this Object obj) 
    { 
    using (var stream = new MemoryStream()) 
    { 
     var ser = new DataContractJsonSerializer(obj.GetType()); 

     ser.WriteObject(stream, obj); 

     return Encoding.UTF8.GetString(stream.ToArray()); 
    } 
    } 

    public static T FromJSONString<T>(this string obj) 
    { 
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj))) 
    { 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
     T ret = (T)ser.ReadObject(stream); 
     return ret; 
    } 
    } 
+0

麪糰!我其實在代碼中有幾個問題。已經修復它......謝謝你,沒有看到那一個。 – LamonteCristo 2011-01-23 00:52:49