Пользовательская XML-сериализация - Включить имя класса - PullRequest
4 голосов
/ 13 января 2012

У меня следующий вывод XML-сериализации:

<?xml version="1.0"?>
<Message>
  <Version>1.0</Version>
  <Body>
    <ExampleObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <EmampleOne>Hello!</EmampleOne>
    </ExampleObject>
  </Body>
</Message>

У меня есть следующие классы:

[Serializable]
    public class Message<T>
    {
        public string Version { get; set; }
        public T Body { get; set; }
    }

[Serializable]
public class ExampleObject
{
    public string EmampleOne { get; set; }
}

Если я сериализую их отдельно, я получу:

<?xml version="1.0"?>
<Message>
  <Version>1.0</Version>
  <Body>
    <EmampleOne>Hello!</EmampleOne>
  </Body>
</Message>

И:

<?xml version="1.0"?>
<ExampleObject>
  <EmampleOne>Hello!</EmampleOne>
</ExampleObject>

Итак, как показано выше, я хочу, чтобы внутреннее тело содержало имя класса <ExampleObject>.

Я использую дженерики, так как мне нужно иметь разныеТело сообщения, сериализуем с кодом:

var obj = new Message<ExampleObject>
{
    Version = "1.0",
    Body = example
};

var serializer2 = new XmlSerializer(typeof (Message<ExampleObject>));

1 Ответ

3 голосов
/ 14 января 2012

Как предложил @Marc Gravell в своем комментарии, вы можете использовать XmlAttributeOverrides :

var xmlOverrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes();
attributes.XmlElements
     .Add(new XmlElementAttribute("ExampleObject", typeof (ExampleObject)));
xmlOverrides.Add(typeof(Message<ExampleObject>), "Body", attributes);

var serializer2 = new XmlSerializer(typeof(Message<ExampleObject>), xmlOverrides);
...