2010-06-21 75 views
4

我想創建一個使用.NET 4.0和WCF的REST Web服務。我的REST服務正在返回一個列表,然後將其序列化爲XML。我遇到的問題是返回的XML從ArrayOf開始,我不喜歡它。ArrayOf當使用列表<T>與WCF休息服務

換句話說,現在的XML看起來是這樣的:

<ArrayOfAchievement> 
    <Achievement> 
     ... 
    </Achievement> 
</ArrayOfAchievement> 

我寧願有XML是這樣的:

<Achievements> 
    <Achievement> 
     ... 
    </Achievement> 
</Achievements> 

如果我創建一個新的類,並調用它AchievementsList,其中有表的屬性<成就>,就像這樣:

public class AchievementsList 
{ 
    public List<Achievement> Achievements { get; set; } 
} 

的n具有我的服務回報上面的類,而不是名單<成就>的XML最終看起來像這樣:

<AchievementsList> 
    <Achievements> 
     <Achievement> 
      ... 
     </Achievement> 
    </Achievements> 
</AchievementsList> 

哪項是錯誤的(因爲它增加了一個不屬於有另一種級別)。

的另一個問題是,我還需要一個命名空間應用於對象,像這樣:

[XmlRoot(Namespace="NameSpaceURL")] 
public class AchievementsList 
{ 
    public List<Achievement> Achievements { get; set; } 
} 

,我不能做,如果我只是返回一個列表<成就>。

那麼我能做些什麼來解決這兩個問題呢?

巴拉

回答

4
  1. 你是在正確的軌道與AchievementList類,但你需要做的是裝飾與XmlElement屬性Achievements列表屬性,並提供各個元素的名稱。

  2. 命名空間繼承AchievementList類,就像你擁有它。

示例代碼:

[Serializable] 
public class Achievement { 
    public string Name { get; set; } 
} 

[Serializable] 
[XmlRoot(ElementName="Achievements", Namespace="http://www.mynamespace.com")] 
public class AchievementList 
{  
    [XmlElement("Achievement")] 
    public List<Achievement> Achievements { get; set; } 

    public AchievementList() 
    { 
     Achievements = new List<Achievement>(); 
    } 

    public void Add(Achievement a) 
    { 
     Achievements.Add(a); 
    } 
} 

而且你的輸出就會是這樣的:

<?xml version="1.0" encoding="utf-16"?> 
<Achievements xmlns="http://www.mynamespace.com"> 
    <Achievement> 
    <Name>Woke Up</Name> 
    </Achievement> 
    <Achievement> 
    <Name>Went to work</Name> 
    </Achievement> 
    <Achievement> 
    <Name>Slacked off</Name> 
    </Achievement> 
</Achievements>} 
+0

當我添加ElementName屬性時,什麼都不會發生。這裏是我的代碼:http://screencast.com/t/MGJkY2MxY ...如果我改變它,以便DataContract和DataMember更改元素名稱,它會做一些奇怪的事情。這裏的代碼在這種情況下:http://screencast.com/t/MGZkY2M0O ...結果:http://screencast.com/t/OWYxYmRlZmQt – Bara 2010-06-22 15:38:07

+0

'[XmlElement(「Achievement」)]'只設置「成就」中的成就的孩子元素 - 它仍然留給你3級元素。 – JoeGaggler 2010-06-28 23:36:47

+0

我在推薦它之前測試了我發佈的代碼,輸出結果是我的測試儀控制檯應用程序吐出的副本和粘貼。隨意將其插入到您自己的測試應用程序中,並讓我知道你是否得到不同的結果。 – 2010-06-29 12:44:44

1

我有一個類似的設置工作是這樣的:從List<Achievement>派生AchievementsList,與裝飾它XmlTypeAttributeXmlRootAttribute,並且還用XmlTypeAttribute修飾Achievement

[XmlType(TypeName = "Achievements", Namespace="http://www.mynamespace.com")] 
[XmlRoot(ElementName = "Achievements", Namespace="http://www.mynamespace.com")] 
public class AchievementsList : List<Achievement> 
{ 
} 

[XmlType(TypeName = "Achievement", Namespace="http://www.mynamespace.com")] 
public class Achievement 
{ 
    ... 
} 

我也用XmlSerializerFormat屬性來裝飾我的服務實現,所以我可以避免通常的DataContract序列化。

1

我問了一個related question關於如何反序列化WCF web服務方法產生的XML,該方法返回List<SomeType>

的XML有一個名爲<ArrayOfSomeType>根,以反序列化回List<SomeType>必須使用DataContractSerializer代替XmlSerializer,因爲它們不兼容。