【问题标题】:How to serialize an IList<T>?如何序列化 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

非常感谢!

【问题讨论】:

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


    【解决方案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)。
    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多