如何序列化IList <t>?</t>

时间:2009-01-21 09:09:16

标签: c# .net web-services .net-3.5 ibatis.net

我有一个返回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。但是我害怕将其转换为List,因为当然mappers的内部工作方式可能会在未来的版本中发生变化(而且感觉很脏)。

我应该......

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

b) return (List<Something>)data;

c) // your solution here

非常感谢!

3 个答案:

答案 0 :(得分:16)

如果它确实是List<T>但您想要防止变更并使其仍然有效,那么最高性能的解决方案是尝试将其转换为列表,如果失败则创建一个新的列出其内容,例如

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

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

答案 1 :(得分:2)

为什么要序列化IList :)只需将它用作您自己的集合的源代码并将其序列化:

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

答案 2 :(得分:0)

我认为你不需要c)。 使用解决方案a)应该是非常安全的。

此解决方案取决于IBatis.net的公共API。好的api不会改变他们的公共api,除非它真的是解决任务关键问题的唯一解决方案

希望这有帮助。