我有下面的代碼是在我的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的構建
THX爲你的研究修復該問題一起發佈這個,夥計! –
@RogerTaylor我相信這已被更新版本的Json.Net – RobV
修復。我希望如此,我目前正在嘗試使用這個偉大的工具,但面對很多問題,其中一些看起來像bug。 –