如何序列化IList ?

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

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

我试图在webservice中使用它想要以1:1的forms返回数据。 当然我不能在WebMethod中返回IList,因为它是一个接口,因此不可序列化。

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

我应该……

 a) return new List(data); b) return (List)data; c) // your solution here 

非常感谢!

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

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

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

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

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

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

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

希望这可以帮助。