XML сериализация объектов с конвертом в C # - PullRequest
7 голосов
/ 05 мая 2011

Мне нужно сериализовать объекты в XML в C #. Объекты должны быть завернуты в конверт. Для этого я создал следующий класс Envelope:

[XmlInclude(typeof(Person))]
public class Envelope
{
    public string SomeValue { get; set; }
    public object WrappedObject { get; set; }
}

Я использую следующий код для сериализации класса:

string fileName = ...;
XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
TextWriter textWriter = new StreamWriter(fileName);
try
{
    serializer.Serialize(textWriter, <instance of envelope>);
}
finally
{
    textWriter.Close();
}

Когда я присваиваю объект типа Person WrappedObject, я получаю следующий XML:

<Envelope>
    <SomeValue>...</SomeValue>
    <WrappedObject xsi:type="Person">
        ....
    </WrappedObject>
</Envelope>

Проблема в том, что я хотел бы, чтобы тег для обернутого объекта был назван в честь фактического класса, который я передаю. Например, если я назначу экземпляр Person для WrappedObject, я бы хотел XML выглядит следующим образом:

<Envelope>
    <SomeValue>...</SomeValue>
    <Person>
        ....
    </Person>
</Envelope>

Если я назначу экземпляр Animal, я бы хотел получить

<Envelope>
    <SomeValue>...</SomeValue>
    <Animal>
        ....
    </Animal>
</Envelope>

Как бы я этого достиг?

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

На самом деле я немного упростил свой пример ... Обернутый объект снова обернут:

public class Envelope
{
    public string SomeValue { get; set; }
    public Wrapper Wrap { get; set; }
}

[XmlInclude(typeof(Person))]
public class Wrapper
{
    public object WrappedObject { get; set; }
}

Как бы я справился с этим с помощью переопределения атрибутов?

1 Ответ

6 голосов
/ 05 мая 2011

Вам необходимо использовать атрибут override . Я использую его сильно , так как я делаю много пользовательских сериализаций.

Это грубый непроверенный фрагмент, но он должен указывать вам правильное направление:

XmlAttributes attributes = new XmlAttributes();
XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides();
attributes.XmlElements.Add(new XmlElementAttribute("Person", t));
xmlAttributeOverrides.Add(typeof(Person), "WrappedObject", attributes);
XmlSerializer myserialiser = new XmlSerializer(typeof(Envelope), xmlAttributeOverrides);
...