2011-07-22 48 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。 –