добавить атрибут в элемент, который является родителем списка - PullRequest
1 голос
/ 26 октября 2011

Я пытаюсь сериализовать объект, но я сталкиваюсь с некоторыми проблемами, касающимися атрибутов родительского элемента, который содержит массив.

У меня есть следующая структура XML, и я не могу добавить атрибут в RatePlanselement.

<Root>
<RatePlans Attribute="??this one??">
    <RatePlan Attribute1="RPC" Attribute2="MC" Attribute3="RPT">
        .
        .
        .
    </RatePlan>
    <RatePlan Attribute1="RPC2" Attribute2="MC3" Attribute3="RPT4">
        .
        .
        .
    </RatePlan>
</RatePlans>
</Root>

Это то, что я сделал до сих пор:

namespace XmlT {
    [Serializable]
    [XmlRoot("Root")]
    public class Root {
        public List<RatePlan> RatePlans { get; set; }
    }
}

namespace XmlT {
[Serializable]
public class RatePlan {


    [XmlAttribute]
    public string RatePlanCode { get; set; }

    [XmlAttribute]
    public string MarketCode { get; set; }

    [XmlAttribute]
    public string RatePlanType { get; set; }
}
}

Это дает мне правильную структуру, но я не знаю, как добавить атрибут, который я хочу

Другой подход

Я пробовал и другой подход, но это дает мне неверные значения.

namespace XmlT {
    [Serializable]
    [XmlRoot("Root")]
    public class Root {
        public RatePlans RatePlans { get; set; }
    }
}

namespace XmlT {
[Serializable]
public class RatePlans {

    [XmlAttribute]
    public string HotelCode { get; set; }

    public List<RatePlan> RatePlan { get; set; }
}
}

РЕДАКТИРОВАТЬ

это метод, который я использую для сериализации

protected static string Serialize<T>(object objToXml, bool IncludeNameSpace = false) where T : class {
        StreamWriter stWriter = null;
        XmlSerializer xmlSerializer;
        string buffer;
        try {
            xmlSerializer = new XmlSerializer(typeof(T));
            MemoryStream memStream = new MemoryStream();
            stWriter = new StreamWriter(memStream);
            if (!IncludeNameSpace) {

                var xs = new XmlSerializerNamespaces();

                xs.Add("", "");
                xmlSerializer.Serialize(stWriter, objToXml, xs);
            } else {
                xmlSerializer.Serialize(stWriter, objToXml);
            }
            buffer = Encoding.ASCII.GetString(memStream.GetBuffer());
        } catch (Exception Ex) {
            throw Ex;
        } finally {
            if (stWriter != null) stWriter.Close();
        }
        return buffer;
    }

Кто-нибудь знает, как я могу это сделать?

Спасибо

1 Ответ

0 голосов
/ 26 октября 2011

Если класс RatePlans из второго примера наследуется от List<RatePlan>, вы получите желаемый результат:

[Serializable]
public class RatePlans: List<RatePlan>
{
    [XmlAttribute]
    public string HotelCode { get; set; }
}

Редактировать:

Мой плохой.Поля классов, наследуемых от коллекций, не будут сериализованы.Я этого не знал.Извините ...

Однако это решение работает:

[Serializable]
[XmlRoot("Root")]
public class Root 
{
    public RatePlans RatePlans { get; set; }
}


[Serializable]
public class RatePlans
{
    [XmlAttribute]
    public string HotelCode { get; set; }

    [XmlElement("RatePlan")]
    public List<RatePlan> Items = new List<RatePlan>();
}
...