C# 如何序列化IList<;T>;?
我有一个OR映射器(iBatis.Net),它返回一个IListC# 如何序列化IList<;T>;?,c#,.net,web-services,.net-3.5,ibatis.net,C#,.net,Web Services,.net 3.5,Ibatis.net,我有一个OR映射器(iBatis.Net),它返回一个IList // IList<T> QueryForList<T>(string statementName, object parameterObject); var data = mapper.QueryForList<Something>(statement, parameters); //IList QueryForList(string语句名,对象参数object); var data=mapp
// IList<T> QueryForList<T>(string statementName, object parameterObject);
var data = mapper.QueryForList<Something>(statement, parameters);
//IList QueryForList(string语句名,对象参数object);
var data=mapper.QueryForList(语句、参数);
我试图在Web服务中使用它,并希望返回1:1的数据。当然,我不能在WebMethod中返回IList,因为它是一个接口,因此不可序列化
我发现映射程序确实返回了一个列表。但是我害怕把它放到列表中,因为当然mappers的内部工作在未来的版本中可能会发生变化(而且感觉很脏)
我也应该
a) return new List<Something>(data);
b) return (List<Something>)data;
c) // your solution here
a)返回新列表(数据);
b) 返回(列表)数据;
c) //您的解决方案在这里
非常感谢 我认为你不需要c)。
使用解决方案a)应该是非常安全的
此解决方案依赖于IBatis.net的公共api。好的api不会改变它们的公共api,除非它真的是解决关键任务问题的唯一方法
希望这能有所帮助。为什么要序列化IList:)只需将其用作您自己的集合的源代码,然后将其序列化:
var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))
var data=mapper.QueryForList(语句、参数);
var yourList=新列表(数据);
//在此处序列化您的列表)
如果它确实是一个列表
,但您希望防止更改并使其仍然有效,那么最有效的解决方案将是尝试将其转换为列表,如果失败,则从其内容创建一个新列表,例如
var data = mapper.QueryForList<T>(statement, parameters);
var list = data as List<T> ?? new List<T>(data);
var data=mapper.QueryForList(语句、参数);
变量列表=数据作为列表??新名单(数据);
但是,您提到不能返回接口,因为它是web服务。ASMX和
XmlSerializer
类可能是这样的,但是如果您使用WCF构建web服务并使用DataContractSerializer
,那么它将愉快地序列化收集接口(作为服务的输入和输出)。这种类型的改变可能比你想要的要大一些 返回的IList是列表这一事实不属于公共API的一部分;这是使用接口的要点,不是我说的。返回ilist是公共apinorbertB的一部分,是的,解决方案a)是安全的,但是如果ilist包含许多元素,那么它的速度会很慢,而且。。。b) 谁是最快的,但不安全,因此我的问题是一个解决方案c)。。那是库尔。我不知道你能和WCF合作。加油!非常感谢。对于这个项目,我将不会切换到WCF,但它的好知道,以供将来参考。我也刚刚认识到:我真的很爱这个??语法;-)因为如果IList已经是一个列表,那么使用它比将项目注入新列表更快。