【问题标题】:Json.Net serializer does not respect TypeNameHandling property correctly?Json.Net 序列化程序不正确尊重 TypeNameHandling 属性?
【发布时间】:2011-08-03 17:28:35
【问题描述】:

我有以下代码,它是我的 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 type 'VDS.RDF.INode' does not have a valid constructor..

现在问题似乎是 Json.Net 正在尝试使用 ISerializable 但我反序列化的特定对象被键入为接口,因此它试图实例化接口而不是该接口的实际实现最初是序列化的。

所以进一步调查我发现 Json.Net 在序列化程序上提供了一个TypeNameHandling 设置,可用于包含类型名称。因此,我将其设置为All,正如您在代码 sn-p 中看到的那样,但这似乎没有任何效果。插入类型名称的唯一类型是 List&lt;T&gt; 类型,这对我没有帮助,仍然给我留下同样令人沮丧的错误消息。

我在这里做错了什么还是 Json.Net 和 TypeNameHandling 设置存在错误?

为了记录,我使用的是最新的 Json.Net 版本,尽管是 .Net 3.5 版本

【问题讨论】:

    标签: c# .net json.net


    【解决方案1】:

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

    我已在http://json.codeplex.com/workitem/21215 上发布了此问题以及一个更简单的测试用例和修复该问题的补丁

    【讨论】:

    • @RogerTaylor 我相信这已在 Json.Net 的更新版本中得到修复
    • 希望如此,我目前正在尝试使用这个很棒的工具,但面临很多问题,其中一些看起来像错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多