Jil.DeserializationException: произошла ошибка при создании десериализатора в кэше Redis

Я использую Redis Cache, используя библиотеку Stack Exchange.

Я использовал библиотеку cloudStructure для использования Redis Dictionary и Redis List.

Проблема в том, что когда я пытаюсь получить значения, и если эта модель имеет нулевое значение для одного свойства списка, она выдает меня ниже исключения -

Jil.DeserializationException: произошла ошибка при создании десериализатора для TestMainClass: ожидался конструктор без параметров для System.Collections.Generic.ICollection1[TestChildClass] ---- Jil.Common.ConstructionException : Expected a parameterless constructor for System.Collections.Generic.ICollection1 [TestChildClass]

public class TestMainClass
    {
        public TestMainClass();
        public int Id { get; set; }
        public virtual ICollection<TestChildClass> Mydata { get; set; }
        public string Title { get; set; }
    }


      public class TestChildClass
    {
        public TestChildClass();
        public int Id { get; set; }
        public string Value { get; set; }
    }

Код Redis для получения значения:

RedisDictionary<int, TestMainClass> dictionary = 
new RedisDictionary<int, TestMainClass>("localhost", "mylocaldictionary");
var result = await dictionary.Get(121);

Что если я не смог преобразовать ICollection в List ?

1 ответ

Решение

Это может быть хорошей функцией, если библиотека сериализации обнаруживает такие интерфейсы, как ICollection<T> а также IList<T> и реализовал их с бетоном List<T> во время десериализации, но, в конечном счете: каждая функция должна быть продумана, рассмотрена (воздействовать), спроектирована, реализована, протестирована, задокументирована и поддержана. Может быть, автор библиотеки считает, что это отличная идея, и ее следует реализовать; это может не быть в списке авторов, но они были бы более чем счастливы получить запрос на выборку; или могут быть веские причины не реализовывать это.

Тем временем, как общее правило, которое решит практически каждую проблему сериализации, с которой вы когда-либо столкнетесь в любой библиотеке:

  • в тот момент, когда библиотека не работает идеально с вашей моделью домена: прекратите сериализацию вашей модели домена - вместо этого используйте DTO

Под этим я подразумеваю: создать отдельный класс или классы, разработанные с учетом конкретного выбора сериализатора. Если захочет List<T>: затем используйте List<T>, Если вам нужны открытые поля: используйте открытые поля. Если он хочет, чтобы типы были отмечены [Serializable]: отметьте типы [Serializable], Если он хочет, чтобы все имена типов начинались с SuperMagic: затем начните имя типа с SuperMagic, Как только вы отделите модель предметной области от модели сериализации, все проблемы исчезнут. Кроме того: вы можете поддерживать несколько сериализаторов параллельно, не вдаваясь в сценарий, что A требует X и не работает с Y; B нужен Y и не работает с X.

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

Другие вопросы по тегам