在JSON.NET IList <t>序列化中,为什么T []和List <t>处理方式不同</t> </t>

时间:2011-10-27 17:17:41

标签: json json.net

我有一个成员IList<A> Things { get; set; }的DTO。假设我有两个类,BC派生自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>

0 个答案:

没有答案