【问题标题】:Json.NET simple interface serializationJson.NET简单接口序列化
【发布时间】:2014-10-28 07:25:20
【问题描述】:

我正在尝试使用 Json.NET 将 IAnimal 实例对象序列化为 json。 类结构:

public class Dog : IAnimal {
    public int Width { get; set; }
    public double Bark { get; set; }
}

public class Cat : IAnimal {
    public int Width { get; set; }
    public double Meow { get; set; }
}

public interface IAnimal {
    int Width { get; set; }
}

public class AnimalContainer {
    public IAnimal Animal { get; set; }
}

尝试过这种方式(请注意我使用了在其他线程中发现的“TypeNameHandling.Auto”):

public void IAnimal_ShouldBeJsonSerializable() {
        var animal = new AnimalContainer {Animal = new Dog {Bark = 5, Width = 2}};
        var json = JsonConvert.SerializeObject(animal,
            new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.Auto});
        var deserializedAnimal = JsonConvert.DeserializeObject<AnimalContainer>(json);
    }

但是向我抛出异常“无法创建 IAnimal 类型的实例,Type 是接口或抽象类,无法实例化”。 但是json包含了具体的类型信息!

我怎样才能让它工作?

【问题讨论】:

标签: c# json json.net


【解决方案1】:

您似乎没有将序列化程序设置传递给您的DeserializeObject 调用。您需要在序列化和反序列化中都包含TypeNameHandling

var animal = new AnimalContainer { Animal = new Dog { Bark = 5, Width = 2 } };
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
var json = JsonConvert.SerializeObject(animal, settings);
var deserializedAnimal = JsonConvert.DeserializeObject<AnimalContainer>(json, settings);
Console.WriteLine(deserializedAnimal.Animal.GetType().Name);

【讨论】:

  • 您好,感谢您的快速响应。当动物是一个接口时它可以工作。抽象类呢?再次遇到同样的异常。
  • 应该仍然有效;我只是通过创建一个抽象的BaseAnimal 类并让DogCat 从它继承来尝试它。 (我将Width 属性移到了基础。)然后我将AnimalContainer 中的Animal 属性更改为“BaseAnimal”。我运行了上面的序列化/反序列化代码,效果很好。
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多