2011-04-21 12 views
6

我最近在一篇文章中發現的WCF服務操作返回collectiondatacontractWCF CollectionDataContract

Users GetUsers(string someInput); 

和用戶類型的定義如下:

[CollectionDataContract] 
    public class Users : List<User> 
    { 
     public Users() 
     { 
     } 

     public Users(IEnumerable<User> users) : base(users) 
     { 
     } 
    } 

是否返回collectiondatacontract(如在用戶這種情況)服務的目的不同於簡單地返回List<User>

+0

有趣.... – Seva 2011-04-21 00:43:00

+1

謝謝!我使用了這個,但也需要調用基構造器來生成幫助頁面 - 所以在你的示例中用'public Users():base(){}'替換:'public Users(){}'。 – 2011-08-31 13:51:56

+0

@IanGrainger還有其他一些錯誤 - 如果沒有另外指定,則無參數base構造函數會自動調用。 – user2864740 2017-09-08 23:48:38

回答

4

據我所知,這個屬性會給你一些控制元素在最終的xml字符串中的名稱,在DataContractSerializer完成序列化你的集合之後。

當你不得不稍後解析結果時,這會很有用(換句話說,你將知道該XML文本中要查找的元素,以查找你的集合及其部分)。

看看這有關示例和詳細信息:

http://msdn.microsoft.com/en-us/library/aa347850.aspx

1

如果你返回一個List,數據串行器有一個生成xml的特定方法。我不知道它是如何做它的列表,但如果它是一個陣列它會產生類似於 - ...這裏用戶對象1 ...等等。

但是使用CollectionDataContract你可以序列化它,並且更好地向可能手動創建XML的消費者公開它。示例 - 我將能夠給 - CollectionDataCOntract(NAME =「AllUsers的」)//我不記得ITEMNAME或名稱

那麼XML預計將類似的東西 - ......這裏用戶對象1 ...等。

這就是一個實用工具。

0

只是爲了闡述對安德烈的回答和分享我的經驗,我只是通過我使用CollectionDataContract終於解決了一個問題去了。基本上,爲了與特定的系統接口,我希望能夠發送和收到的格式的XML:

<SomeMessageList> 
    <Message> 
    <ID>blah</ID> 
    <data1>blah</data1> 
    <data2>etc.etc.</data2> 
    </Message> 
    <Message> 
    <ID>blah</ID> 
    <data1>blah</data1> 
    <data2>etc.etc.</data2> 
    </Message> 
    //any number of repeated <Message> here 
</SomeMessageList> 

然而,如果我用數組或列表對象,根標記總是稱爲ArrayOfMessage。如果我創建了一個擁有Message對象數組的類(可以稱爲MsgList),那麼WCF會將它添加爲混合中的額外標記,這是我找不到擺脫的方法。所以它會看起來像:

<SomeMessageList> 
    <MsgList> 
    <Message> 
     <ID>blah</ID> 
     <data1>blah</data1> 
     <data2>etc.etc.</data2> 
    </Message> 
    //any number of repeated <Message> here 
    </MsgList> 
</SomeMessageList> 

所以CollectionDataContract只是給了我一個簡單的方法來控制根列表元素的名稱。