带有属性的自定义XML序列化

本文关键字:XML 序列化 自定义 属性 | 更新日期: 2023-09-27 18:17:54

是否有办法让xml序列化器转换以下内容:

class Mail
{
    public string Subject = "sub1";
}

转换成以下XML模式:

<Mail>
    <MailSubject>
        <Subject>sub1</Subject>
    </MailSubject>
</Mail>

也就是说,我想将xmlElement包装在一个新的xmlElement组中,而不使用以下子类:

class Mail
{
    public MailSubject MailSubject = new MailSubject();
}
class MailSubject
{
    public string Subject = "sub1";
}

我的xml格式来自第三方,我试图使它使我们的对象是有意义的,很容易使用,同时仍然保持他们的xml模式

带有属性的自定义XML序列化

正如Buh Buh所说,实现这一点的唯一方法是实现IXmlSerializable。一个可能的实现是这样的:

public class Mail : IXmlSerializable
{
    public string Subject;
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }
    public void ReadXml(System.Xml.XmlReader reader)
    {
        bool isEmpty = reader.IsEmptyElement;
        reader.ReadStartElement();  
        if (isEmpty) return;
        isEmpty = reader.IsEmptyElement;
        reader.ReadStartElement();
        if (isEmpty)
        {
            reader.ReadEndElement();
            return;
        }
        Subject = reader.ReadString();
        reader.ReadEndElement();
        reader.ReadEndElement();
    }
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteStartElement("MailSubject");
        writer.WriteElementString("Subject", Subject);
        writer.WriteEndElement();
    }
}

如果你让Mail实现IXmlSerializable,那么你可以有任何你喜欢的xml。但是这可能会产生比您真正想要做的更多的工作。