I know that I can specify xml-element-names for list-elements when using XmlSerializer via the XmlArrayItem-attribute. This however only works for lists, which are fields (or properties). Is there a way to set this for any list?
Example:
[XmlInclude(typeof(Foo1)),
XmlInclude(typeof(Foo2))]
public abstract class Bar {
public string s;
}
public class Foo1 : Bar { }
public class Foo2 : Bar { }
public class Test {
[XmlArray("Bars"),
XmlArrayItem(typeof(Foo1), ElementName = "derived1"),
XmlArrayItem(typeof(Foo2), ElementName = "derived2"),
XmlArrayItem(typeof(Bar), ElementName = "base")]
public List<Bar> list;
public Test() { }
public Test(List<Bar> list) {
this.list = list;
}
}
When using method A:
XmlWriter write = GetWriter();
Test test = GetTest();
XmlSerializer serializer = new XmlSerializer(test.GetType());
serializer.Serialize(writer, test);
xml A looks like:
<Bars>
<derived1>
<s>s1_1</s>
</derived1>
<derived1>
<s>s1_2</s>
</derived1>
<derived1>
<s>s1_3</s>
</derived1>
<derived2>
<s>s2_1</s>
</derived2>
</Bars>
However when using method B
XmlWriter otherWriter = GetOtherWriter();
List<Bar> bars = test.list;
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof(Foo1), new XmlAttributes {
XmlType = new XmlTypeAttribute("derived1")
});
overrides.Add(typeof(Foo2), new XmlAttributes {
XmlType = new XmlTypeAttribute("derived2")
});
overrides.Add(typeof(Bar), new XmlAttributes {
XmlType = new XmlTypeAttribute("base")
});
serializer = new XmlSerializer(bars.GetType(), overrides, Type.EmptyTypes, new XmlRootAttribute("Bars"), "");
serializer.Serialize(otherWriter, bars);
xml B looks like:
<Bars>
<base xsi:type="derived1">
<s>s1_1</s>
</base>
<base xsi:type="derived1">
<s>s1_2</s>
</base>
<base xsi:type="derived1">
<s>s1_3</s>
</base>
<base xsi:type="derived2">
<s>s2_1</s>
</base>
</Bars>
How can I get xml A using method B?
Thanks in advance