Десериализация интерфейсных объектов - PullRequest
0 голосов
/ 14 декабря 2018

Я попробовал архитектуру SOLID в своем последнем проекте.

У меня есть интерфейс с именем ILog и класс Log, который реализовал ILog.(В моем понимании это должно быть сделано, чтобы следовать принципу Open / Closed)

Чтобы оставаться открытым для расширений, я реализовал интерфейс с помощью List<ILog>, а не с твердой реализацией List<Log>.

Сериализация List<ILog> не проблема, но десериализация есть.Конечно, я понимаю, почему десериализатор не знает, какой класс реализации он должен использовать.

Вопрос: Как узнать, в какой конкретный тип десериализовать объект, сериализованный через интерфейсссылка

1 Ответ

0 голосов
/ 14 декабря 2018

Сериализация списка не является проблемой, но десериализация - это.

Если вы десериализуете, вам обязательно нужно каким-то образом сообщить вашему сериализатору, какое конкретное представление вашего интерфейса использовать.В случае Json.NET вы можете использовать JsonConstructorAttribute (см. Также этот ответ ) или преобразователи в сочетании с внедрением зависимостей.

Вопрос: Что помогает мне работать со списком, если мне нужно в любом случае определить конкретный класс реализации для хранения / импорта данных?

Интерфейсы отделяют ваш код от фактической реализации, чтоприводит к различным преимуществам.Например, с точки зрения модульного тестирования, они облегчают mocking (так как вы можете удовлетворить интерфейс с помощью mocked экземпляра вместо того, чтобы принудительно использовать «реальный» класс).Также интерфейсы позволяют вам извлечь выгоду из ковариации / контравариантности , которую вы не получили бы с классами в C #.Чтобы узнать больше о преимуществах интерфейсов, взгляните на различные ответы на этот вопрос или посмотрите этот пост в блоге.

Как было сказано выше, интерфейсы всегдаввести определенный уровень издержек / абстракции, и вам необходимо оценить для каждого случая / ситуации, имеют ли они смысл или нет.

Каков наилучший способ обработки данных интерфейса объектов хранения илиони используются только во время выполнения?

Вам обязательно нужно хранить конкретные представления, что означает, что во время сохранения вам нужно решить, какую конкретную реализацию использовать для хранения (и последующей десериализации).

...