如何序列化 IList<T>?

Posted

技术标签:

【中文标题】如何序列化 IList<T>?【英文标题】:How to serialize an IList<T>? 【发布时间】:2010-10-02 15:31:25 【问题描述】:

我有一个返回 IList 的 OR 映射器 (iBatis.Net)。

// IList<T> QueryForList<T>(string statementName, object parameterObject);
var data = mapper.QueryForList<Something>(statement, parameters);

我正在尝试在 Web 服务中使用它并希望以 1:1 的比例返回数据。当然,我不能在 WebMethod 中返回 IList,因为它是一个接口,因此不可序列化。

我发现映射器确实返回了一个列表。但是我害怕将其转换为 List,因为映射器的内部工作当然可能会在未来的版本中发生变化(而且感觉很脏)。

我也应该...

a) return new List<Something>(data);

b) return (List<Something>)data;

c) // your solution here

非常感谢!

【问题讨论】:

【参考方案1】:

如果它确实是 List&lt;T&gt; 但您想防止更改并让它仍然有效,那么最高效的解决方案是尝试将其转换为列表,如果失败则创建一个新列表它的内容,例如

var data = mapper.QueryForList<T>(statement, parameters);
var list = data as List<T> ?? new List<T>(data);

但是,您提到不能返回接口,因为它是 Web 服务。对于 ASMX 和 XmlSerializer 类,这可能是正确的,但如果您使用 WCF 构建 Web 服务并使用 DataContractSerializer,那么它将很高兴地序列化集合接口(作为服务的输入和输出)。不过,这种类型的更改可能比您想要的要大一些!

【讨论】:

哇.. 太酷了。我不知道你可以与 WCF 合作。摇滚吧! 谢谢!对于这个项目,我不会切换到 WCF,但很高兴知道以供将来参考。我也刚刚认识到:我真的很喜欢??语法 ;-)【参考方案2】:

为什么要序列化 ​​IList :) 只需将其用作您自己的集合的源并对其进行序列化即可:

var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))

【讨论】:

因为如果IList已经是一个List,那么使用它而不是把item抽到一个新的List中会更快。【参考方案3】:

我认为您不需要 c)。 使用解决方案 a) 应该是相当安全的。

这个解决方案依赖于 IBatis.net 的公共 api。好的 api 不会更改他们的公共 api,除非它真的是解决关键任务问题的唯一解决方案

希望这会有所帮助。

【讨论】:

返回的 IList 是一个 List 的事实不是公共 API 的一部分;这就是使用接口的全部意义所在。 不是我说的。返回 ilist 是公共 api 的一部分 norbertB,是的,解决方案 a) 是安全的,但如果 IList 包含许多元素,它会很慢,而且... b) 应该是最快的但不安全,因此我的问题是解决方案 c)。

以上是关于如何序列化 IList<T>?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Json.Net 序列化/反序列化具有附加属性的自定义集合

如何对 IList<T> 执行二进制搜索?

如何转换通用IList IList?

WCF+Nhibernate循环引用导致序列化的问题

C# 中的数组如何部分实现 IList<T>?

如何序列化/反序列化IList集合的类包装器?