2

我正在使用堆栈交换库使用 Redis 缓存。

我使用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.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 < T > 转换为 List < T > 怎么办?

4

1 回答 1

3

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

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

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

我的意思是:创建一个或多个单独的类,这些类在设计时要考虑到序列化程序的特定选择。如果它想要List<T>:然后使用List<T>. 如果它想要公共领域:使用公共领域。如果它想要[Serializable]标记类型:标记类型[Serializable]。如果它希望所有类型名称都以SuperMagic: 开头,那么类型名称以. 开头SuperMagic。一旦你将领域模型与序列化模型分开,所有的问题都会消失。另外:你可以并行支持多个序列化器,而不会陷入A需要X而不用Y的场景;B 需要 Y 并且不适用于 X。

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

于 2015-09-04T11:36:31.433 回答