我有一个成员IList<A> Things { get; set; }
的DTO。假设我有两个类,B
和C
派生自A。我想在此多态列表中保留类型信息,因此我在序列化器设置中指定TypeNameHandling = TypeNameHandling.Auto
。如果我以这种方式将Things
设置为数组(实现IList<A>
)
Things = new A[] { new B(), new C() }
然后我得到一个序列化的字符串
{"Things":{"$type":"A", "$values":[{"$type":"B"}, {"$type":"C"}]}}
如果我像这样分配一个实际的List<A>
Things = new List<A> { new B(), new C() }
然后我得到一个序列化的字符串
{"Things":[{"$type":"B"}, {"$type":"C"}]}
后者更适用于第三方客户端,因为它将类似列表的内容转换为实际数组,而不是包装数组。不幸的是,通过正确定义DTO,无法保证这种良好的行为。通过将集合定义为IList<A>
,我仍无法控制某人是否会分配A[]
或List<A>
(甚至是其他内容)。
事实证明,如果我将我的DTO定义为A[] Things { get; set; }
,那么序列化就像我期望的那样。所以也许这个问题的正确答案是“不要那样做!”但令我感到奇怪的是,具体的A[]
类型将被不同地序列化,具体取决于是将其视为A[]
还是IList<T>
。