2011-07-22 91 views
1

我有下面的代碼是在我的API序列化支持單元測試的一部分:Json.Net序列化程序不正確地尊重TypeNameHandling屬性?

private void TestGraphSerializationJson(IGraph g) 
    { 
     StringWriter writer = new StringWriter(); 
     JsonSerializer serializer = new JsonSerializer(); 
     //The following line should make the serializer output type names 
     //in the JSON but seems to be ignored 
     serializer.TypeNameHandling = TypeNameHandling.All; 

     serializer.Serialize(new JsonTextWriter(writer), g); 
     Console.WriteLine("Serialized Form:"); 
     Console.WriteLine(writer.ToString()); 
     Console.WriteLine(); 

     Object h = serializer.Deserialize<Graph>(new JsonTextReader(new StringReader(writer.ToString())));// as Graph; 
     Console.WriteLine(h.GetType().FullName); 
     Assert.AreEqual(g, h, "Graphs should be equal"); 
    } 

在我的API各種類實現ISerializable接口,並Json.Net相當愉快連載我的班到合適的JSON。

的問題是,當我嘗試和反序列化我的對象,我得到一個相當史詩堆棧跟蹤和以下錯誤消息:

試驗方法VDS.RDF.Test.Writing.Serialization.GraphSerializationTests.SerializationJsonGraph扔例外:Newtonsoft.Json.JsonSerializationException:ISerializable的類型「VDS.RDF.INode」沒有有效的構造..

現在的問題似乎是Json.Net嘗試使用ISerializable但具體我正在反序列化的對象被鍵入爲接口,因此它是試圖實例化接口,而不是最初序列化的接口的實際實現。

因此,進一步調查,我看到Json.Net在序列化程序中提供了一個TypeNameHandling設置,可用於包含類型名稱。所以我把它設置爲All,就像你在代碼片段中看到的一樣,但是這似乎沒有任何作用。插入類型名稱的唯一類型是List<T>類型,這對我沒有任何幫助,仍然給我帶來了同樣令人沮喪的錯誤消息。

我在這裏做錯了什麼,或者是否存在Json.Net和TypeNameHandling設置的錯誤?

爲了記錄我使用的是最新的Json.Net釋放雖然在NET 3.5的構建

回答

1

這實際上似乎在進一步調查後要在Json.Net錯誤。

我有一個更最小的測試案例和補丁程序,在http://json.codeplex.com/workitem/21215

+1

THX爲你的研究修復該問題一起發佈這個,夥計! –

+0

@RogerTaylor我相信這已被更新版本的Json.Net – RobV

+0

修復。我希望如此,我目前正在嘗試使用這個偉大的工具,但面對很多問題,其中一些看起來像bug。 –