Jil.DeserializationException:在 Redis 缓存中构建解串器时出错

Jil.DeserializationException : Error occurred building a deserializer in redis cache

我正在使用 Stack Exchange 库使用 Redis 缓存。

我使用 cloudStructure 库来使用 Redis 字典和 Redis 列表。

Problem is when I try to retrieve values and if that model has a null value for one list property it is throwing me below exception -

Jil.DeserializationException : Error occurred building a deserializer for TestMainClass: Expected a parameterless constructor for 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 怎么办?

如果序列化库检测到 ICollection<T>IList<T> 等接口并在反序列化期间使用具体的 List<T> 实现它们,这可能是一个不错的功能,但最终:每个功能都需要被想到、考虑(影响)、设计、实施、测试、记录和支持。可能库作者觉得这是个好主意,应该实施;它在作者列表中的排名可能不高,但他们很乐意接受 pull request;或者可能有充分的理由不实施它。

在此期间,一般规则将解决您在任何库中遇到的几乎所有序列化问题:

  • 当库不能与您的域模型完美配合时:停止序列化您的域模型 - 改用 DTO

我的意思是:创建一个 separate class 或 classes,它们在设计时考虑了特定的序列化程序选择。如果它想要List<T>:那么使用List<T>。如果它需要 public 个字段:使用 public 个字段。如果它想要标记类型[Serializable]:标记类型[Serializable]。如果它希望所有类型名称都以 SuperMagic 开头:则类型名称以 SuperMagic 开头。一旦将域模型与序列化模型分离,所有问题都会消失。此外:您可以并行支持 多个 序列化程序,而不会陷入 A 需要 X 而不能与 Y 一起工作的场景; B 需要 Y 但不能与 X 一起使用。

然后您需要做的就是编写几行代码以在两个相似模型之间进行映射(或使用完全可以做到这一点的库,例如 AutoMapper)。