2014-10-27 2 views
1

Я пытаюсь сериализовать объект экземпляра IAnimal для json с помощью Json.NET. Структура Класс:Простая сериализация интерфейса Json.NET

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 содержит информацию о конкретном типе!

Как я могу заставить его работать?

+0

http://stackoverflow.com/questions/24644464/json-net-type-is-an-interface-or-abstract-class-and-cannot-be-instantiated –

+1

Ваш '' Animals' есть Width' ??? – Shiva

ответ

2

Не похоже, что вы передаете настройки сериализатора на ваш вызов DeserializeObject. Вы должны включить TypeNameHandling как в Serialize, так и в Deserialize.

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); 
+0

Эй, спасибо за быстрый ответ. Он работает, когда животное является интерфейсом. А как насчет абстрактного класса? Возвращение к тому же самому исключению. – mbudnik

+0

Должен по-прежнему работать; Я просто попробовал это, создав абстрактный класс «BaseAnimal» и сделав из него «Собака» и «Кошка». (Я переместил свойство 'Width' на базу.) Затем я изменил свойство« Animal »в« AnimalContainer »как« BaseAnimal ». Я выполнил указанный выше код сериализации/десериализации, и он работал нормально. –

+0

Сделано опечатка. Сейчас он работает =] – mbudnik