Json.Net序列化程序不正确地遵循TypeNameHandling属性?

时间:2011-07-22 14:08:02

标签: c# .net json.net

我有以下代码,它是我的API中序列化支持的单元测试的一部分:

    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 个答案:

答案 0 :(得分:1)

在进一步调查后,这实际上似乎是Json.Net中的错误。

我已经发布了这个以及一个更小的测试用例和修补程序来修复http://json.codeplex.com/workitem/21215

的问题