Сериализация интерфейса как JsonResult - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь написать. NET Core API, который возвращает список объектов. Следующий класс используется для отправки ответов:

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

Существует пустой интерфейс:

interface IAnimal {

}

Есть также 2 класса, которые реализуют этот интерфейс:

class Cat : IAnimal {
    public string CatProperty { get; set; }
}

class Dog : IAnimal { 
    public string DogProperty { get; set; }
}

Как видите, свойство Animal класса AnimalResponse может содержать объект класса Cat или Dog. Вот как я отправляю ответ:

var response = new AnimalResponse() {
    Animal = new Cat() { 
         CatProperty = "Cat Property Value"
    }
};
return JsonResult(response);

По какой-то причине CatProperty пропускается в ответе API после сериализации. API возвращает следующее json: {Animal:{}}.

Итак, как мне сделать так, чтобы оно включало все свойства c, определенные для класса?

Примечание: я использую Microsoft.AspNetCore.Mvc.JsonResult, не Newtonsoft.Json.

1 Ответ

0 голосов
/ 04 мая 2020

Если вы читаете также здесь Почему интерфейсы не [Сериализуемые]? интерфейсы не сериализуемы, потому что они определяют контракт, а не данные.

Они представляют собой способ определения поведения для класса.

Кстати, вы должны иметь возможность сделать его сериализуемым путем реализации интерфейса ISerializable.

РЕДАКТИРОВАТЬ: рассмотрите возможность использования базового класса вместо интерфейса, если вам нужно только сериализовать данные. Если вам нужно иметь оба варианта, возможно, лучшим решением будет иметь базовый класс и интерфейс и реализовать оба.

ОБНОВЛЕНИЕ: Базовый класс должен реализовывать интерфейс ISerializable.

...