使用IXmlSerializable自定义xml输出

本文关键字:输出 xml 自定义 IXmlSerializable 使用 | 更新日期: 2023-09-27 18:22:47

我试图实现的目标似乎相当简单。

给定类别

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

我只想将Data参数的XML输出封装在<Data></Data>标记中。

即:期望输出:

<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);
    }
}

使用IXmlSerializable自定义xml输出

您可以使用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);

架构

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>