Настройка вывода xml с помощью IXmlSerializable - PullRequest
1 голос
/ 07 февраля 2012

То, чего я пытаюсь достичь, кажется довольно простым.

Учитывая класс

public class Wrapper<T> { 
   T Data { get; set; }
   bool Success { get;set; }
   List<Error> Errors { get; set; }
}

Я просто хочу, чтобы вывод XML для параметра Data был заключен в тег <Data></Data>.

IE: Желаемый вывод:

<Wrapper>
    <Data>
       <Person first="Bob" last="Robertson"/>
    </Data>
   <Errors/>
    <Success>true</Success>
</Wrapper

Фактическая выработка:

<Wrapper>
    <Person first="Bob" last="Robertson"/>
    <Errors/>
    <Success>true</Success>
</Wrapper>

Существует ли простая реализация IXmlSerializable, где я могу оставить сериализацию в одиночку большей частью и просто обернуть один элемент?

Редактировать: Это в службе WCF, поэтому у меня нет (насколько я знаю) доступа к созданию XmlSerializer.

Что я закончил делать:

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("Success", Success.ToString());
        writer.WriteStartElement("Errors");

        foreach (var error in Errors)
        {
            Util.XmlSerialize(error, writer);
        }

        writer.WriteStartElement("Data");
        Util.XmlSerialize(this.Data, writer);
        writer.WriteEndElement();
    }

-

public class Util
{
    public static void XmlSerialize<T>(T obj, XmlWriter writer)
    {
        var nsSerializer = new XmlSerializerNamespaces();
        nsSerializer.Add("", "");

        var ser = new XmlSerializer(typeof (T));
        ser.Serialize(writer, obj, nsSerializer);
    }
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Схема

public class Wrapper<T>
{
    public T Data { get; set; }
    public bool Success { get; set; }
}


public class Person
{
    public string first;
    public string last;
}

Сериализация XML

        Wrapper<Person> f = new Wrapper<Person>();
        f.Data = new Person();
        f.Data.first = "Bob";
        f.Data.last = "Robertson";
        XmlSerializer SerializerObj = new XmlSerializer(typeof(Wrapper<Person>));
        TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml");
        SerializerObj.Serialize(WriteFileStream, f);
        WriteFileStream.Close();

Вывод XML

<?xml version="1.0" encoding="utf-8"?>
<WrapperOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Data>
    <first>Bob</first>
    <last>Robertson</last>
  </Data>
  <Success>false</Success>
</WrapperOfPerson>
0 голосов
/ 07 февраля 2012

Вы можете использовать XmlOverrides:

var xmlOverrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes();
attributes.XmlElements
     .Add(new XmlElementAttribute("Person", typeof (Person)));
xmlOverrides.Add(typeof(Wrapper<Person>), "Data", attributes);

var serializer = new XmlSerializer(typeof(Wrapper<ExampleObject>), xmlOverrides);
...