2012-12-13 205 views
0

我使用API​​來搜索酒店,我們將這種類型稱爲1.它被XmlSerializer反序列化到我的Hotel類中,並且這一切都按預期正常工作。我的問題是當我正在進行另一個API調用時,我們將調用類型2,並且想要重新使用我的Hotel類。覆蓋XML反序列化的屬性

API調用非常相似,類型1返回附近酒店列表,類型2返回特定酒店的更多詳細信息。我試圖解析的額外信息之一是圖像。在1型和我Hotel I類有:

[XmlElement("images")] 
public virtual string ImageURL { get; set; } 

這對於1型呼叫工作正常。現在對於類型2調用,它是一個圖像數組,而不僅僅是一個字符串。我創建了一個名爲Hotel2新的類,它從Hotel派生,如下所示:

public class Hotel2 : Hotel 
{ 
    [XmlArray("images")] 
    [XmlArrayItem("url")] 
    public List<string> ImageURLs { get; set; } 

    [XmlIgnore] 
    public override string ImageURL 
    { 
     get 
     { 
      return (this.ImageURLs != null && this.ImageURLs.Count > 0 ? this.ImageURLs[0] : String.Empty); 
     } 
    } 

}

,你可以看到我有一個新的屬性ImageURLs(注意「S」)的處理陣列。我也覆蓋ImageURL屬性,它返回ImageURLs集合中的第一個圖像,並將其標記爲XmlIgnore,因此它不會被反序列化。

的問題是,它似乎XmlSerializer忽略我XmlIgnore財產,並試圖由此反序列化基礎屬性導致此異常:The XML element 'images' from namespace '' is already present in the current scope. Use XML attributes to specify another XML name or namespace for the element.

任何想法,我能做些什麼嗎?我也嘗試用new來隱藏該物業,但沒有成功。

+0

就個人而言,我會說,'有一些單一的東西成才 ... 別的'是從架構角度來看一個非常糟糕的主意。如果第一個是''(注意不是's'),那麼做起來很微不足道,而且更清晰。 –

+0

@MarcGravell,我同意,但API不在我的控制範圍之內,原因是「遺留問題」。 – eth0

+3

你可以用'XmlAttributeOverrides'來做,但坦率地說,我的建議是:去兩個模型 –

回答

0

使用XmlAttributeOverrides馬克建議後,覺得有點「髒」,所以我決定創建一個抽象類HotelBase,使得ImageURL財產抽象與XmlIgnore裝飾它。現在我可以在我的Hotel1Hotel2類中覆蓋它。