2009-01-21 69 views
14

我有一個OR映射器(iBatis.Net),返回一個IList。如何序列化IList <T>?

// 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 

非常感謝!

回答

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,那麼它將愉快地序列化收集接口(作爲服務的輸入和輸出)。雖然這種改變可能比你想要的要大一些!

0

我不認爲你需要c)。 使用解決方案a)應該是非常安全的。

此解決方案取決於IBatis.net的公共API。好的API不會改變他們的公共API,除非它真的是唯一的解決任務關鍵問題的方法

希望這有助於。

+1

IList返回的是List的事實不是公共API的一部分;這是使用接口的所有要點。 – 2009-01-21 09:52:40

+0

不是我說的。返回ilist是公共API的一部分 – norbertB 2009-01-21 11:53:07

+0

norbertB,是的,解決方案a)是安全的,但是如果IList包含很多元素,它會很慢,也... b)最快但不安全,因此我的問題是解決方案c)。 – Hinek 2010-06-04 11:57:14

2

你爲什麼要序列化的IList :)只要使用它作爲一個源爲自己的收集和序列化:

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