Jil.DeserializationException: произошла ошибка при создании десериализатора в кэше Redis
Я использую Redis Cache, используя библиотеку Stack Exchange.
Я использовал библиотеку cloudStructure для использования Redis Dictionary и Redis List.
Проблема в том, что когда я пытаюсь получить значения, и если эта модель имеет нулевое значение для одного свойства списка, она выдает меня ниже исключения -
Jil.DeserializationException: произошла ошибка при создании десериализатора для TestMainClass: ожидался конструктор без параметров для System.Collections.Generic.ICollection
1[TestChildClass] ---- Jil.Common.ConstructionException : Expected a parameterless constructor for System.Collections.Generic.ICollection
1 [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
1 ответ
Это может быть хорошей функцией, если библиотека сериализации обнаруживает такие интерфейсы, как ICollection<T>
а также IList<T>
и реализовал их с бетоном List<T>
во время десериализации, но, в конечном счете: каждая функция должна быть продумана, рассмотрена (воздействовать), спроектирована, реализована, протестирована, задокументирована и поддержана. Может быть, автор библиотеки считает, что это отличная идея, и ее следует реализовать; это может не быть в списке авторов, но они были бы более чем счастливы получить запрос на выборку; или могут быть веские причины не реализовывать это.
Тем временем, как общее правило, которое решит практически каждую проблему сериализации, с которой вы когда-либо столкнетесь в любой библиотеке:
- в тот момент, когда библиотека не работает идеально с вашей моделью домена: прекратите сериализацию вашей модели домена - вместо этого используйте DTO
Под этим я подразумеваю: создать отдельный класс или классы, разработанные с учетом конкретного выбора сериализатора. Если захочет List<T>
: затем используйте List<T>
, Если вам нужны открытые поля: используйте открытые поля. Если он хочет, чтобы типы были отмечены [Serializable]
: отметьте типы [Serializable]
, Если он хочет, чтобы все имена типов начинались с SuperMagic
: затем начните имя типа с SuperMagic
, Как только вы отделите модель предметной области от модели сериализации, все проблемы исчезнут. Кроме того: вы можете поддерживать несколько сериализаторов параллельно, не вдаваясь в сценарий, что A требует X и не работает с Y; B нужен Y и не работает с X.
Все, что вам нужно сделать, это написать несколько строк кода для сопоставления между двумя похожими моделями (или использовать библиотеки, которые делают именно это, например, AutoMapper).