0

私はホテルを検索するために API を使用しています。これをタイプ 1 と呼びます。それはXmlSerializer私のHotelクラスに逆シリアル化され、これはすべて期待どおりに正常に機能します。私の問題は、タイプ 2 を呼び出す別の API 呼び出しを行っており、Hotelクラスを再利用したい場合です。

API 呼び出しはよく似ており、タイプ 1 は近くのホテルのリストを返し、タイプ 2 は特定のホテルの詳細を返します。私が解析しようとしている余分な情報の 1 つは画像です。タイプ1と私のHotelクラスには次のものがあります:

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

これは、タイプ 1 の呼び出しでは正常に機能します。タイプ 2 の呼び出しでは、単なる 1 つの文字列ではなく、画像の配列になります。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また、コレクション内の最初の Image を返すプロパティをオーバーライドし、逆シリアル化されないように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が、成功しませんでした。

4

1 に答える 1

0

Marc が の使用を提案した後XmlAttributeOverrides、少し「汚い」と感じたので、抽象HotelBaseクラスを作成し、ImageURLプロパティを抽象化し、 で装飾することにしましXmlIgnoreた。Hotel1これで、クラスとクラスでオーバーライドできますHotel2

于 2012-12-13T11:39:00.277 に答える