Custom XML-element name for base class field in serialization

允我心安 提交于 2020-01-24 00:30:09

问题


How can I change XML-element name for field inherited from base class while doing serialization?

For example I have next base class:

public class One
{
    public int OneField;
}

Serialization code:

static void Main()
{
    One test = new One { OneField = 1 };
    var serializer = new XmlSerializer(typeof (One));
    TextWriter writer = new StreamWriter("Output.xml");
    serializer.Serialize(writer, test);
    writer.Close();
}

I get what I need:

<?xml version="1.0" encoding="utf-8"?>
<One xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OneField>1</OneField>
</One>

Now I have created new class inherited from A with additional field and custom XML element name for it:

public class Two : One
{
    [XmlElement("SecondField")]
    public int TwoField;
}

Serialization code:

static void Main()
{
    Two test = new Two { OneField = 1, TwoField = 2 };

    var serializer = new XmlSerializer(typeof (Two));
    TextWriter writer = new StreamWriter("Output.xml");
    serializer.Serialize(writer, test);
    writer.Close();
}

As a result I get next output:

<?xml version="1.0" encoding="utf-8"?>
<Two xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OneField>1</OneField>
  <SecondField>2</SecondField>
</Two>

The problem is that I want to change OneField in this output to FirstField without touching base class code (because I will use it too and the names must be original). How can I accomplish this?

Thank you.


回答1:


Try this:

public class Two : One
{
    private static XmlAttributeOverrides xmlOverrides;
    public static XmlAttributeOverrides XmlOverrides
    {
        get
        {
            if (xmlOverrides == null)
            {
                xmlOverrides = new XmlAttributeOverrides();
                var attr = new XmlAttributes();
                attr.XmlElements.Add(new XmlElementAttribute("FirstField"));
                xmlOverrides.Add(typeof(One), "OneField", attr);
            }
            return xmlOverrides;
        }
    }

    [XmlElement("SecondField")]
    public string TwoField;

}

And your serializer init is a lot easier:

 var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Two), Two.XmlOverrides);



回答2:


Here's a workaround: Override the fields in the subclass and mark the overriden field with whatever name you need. For example,

class One
{
    public int OneField { get; set; }
}

class Two : One
{
    [XmlElement("FirstField")]
    public new int OneField
    {
       get { return base.OneField; }
       set { base.OneField = value; }
    }
}


来源:https://stackoverflow.com/questions/6258168/custom-xml-element-name-for-base-class-field-in-serialization

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!