序列化中基类字段的自定义XML元素名称
如何在进行序列化时更改从基类inheritance的字段的XML元素名称?
例如,我有下一个基类:
public class One { public int OneField; }
序列化代码:
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(); }
我得到了我需要的东西:
1
现在我创建了A
inheritance自A
新类,并为其添加了字段和自定义XML元素名称:
public class Two : One { [XmlElement("SecondField")] public int TwoField; }
序列化代码:
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(); }
结果我得到下一个输出:
1 2
问题是我想在不输入基类代码的情况下将此输出中的FirstField
更改为FirstField
(因为我也将使用它并且名称必须是原始的)。 我怎么能做到这一点?
谢谢。
试试这个:
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; }
并且您的序列化程序初始化更容易:
var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Two), Two.XmlOverrides);
这是一个解决方法:覆盖子类中的字段,并使用您需要的任何名称标记overriden字段。 例如,
class One { public int OneField { get; set; } } class Two : One { [XmlElement("FirstField")] public new int OneField { get { return base.OneField; } set { base.OneField = value; } } }