首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何序列化IList<T>?

如何序列化IList<T>?
EN

Stack Overflow用户
提问于 2009-01-21 09:09:16
回答 3查看 11.8K关注 0票数 15

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

代码语言:javascript
复制
// IList<T> QueryForList<T>(string statementName, object parameterObject);
var data = mapper.QueryForList<Something>(statement, parameters);

当然,我不能在WebMethod中返回IList,因为它是一个接口,因此不能序列化。

我发现映射器实际上返回了一个列表。但我不敢将其转换为列表,因为映射器的内部工作方式在未来的版本中可能会发生变化(而且它感觉很脏)。

所以我应该..。

代码语言:javascript
复制
a) return new List<Something>(data);

b) return (List<Something>)data;

c) // your solution here

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-21 09:28:27

如果它真的是一个List<T>,但您想要防止更改并使其仍然有效,那么最有效的解决方案将是尝试将其转换为列表,如果这失败了,则根据其内容创建一个新列表,例如

代码语言:javascript
复制
var data = mapper.QueryForList<T>(statement, parameters);
var list = data as List<T> ?? new List<T>(data);

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

票数 16
EN

Stack Overflow用户

发布于 2009-01-21 09:19:03

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

代码语言:javascript
复制
var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))
票数 2
EN

Stack Overflow用户

发布于 2009-01-21 09:17:04

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

该方案依赖于IBatis.net的公共接口。好的api不会更改它们的公共api,除非它确实是关键任务问题的唯一解决方案

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/464525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档