1

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

Thomas
  • 1,225
  • 7
  • 16
  • I don't think there's a way to do it globally because neither `[XmlArray]` nor `[XmlArrayItem]` nor `[XmlElement]` can be applied directly to a type. See [Constructor of a XmlSerializer serializing a `List` throws an InvalidOperationException when used with XmlAttributeOverrides](https://stackoverflow.com/q/47119999/3744182) for a similar question. – dbc Jan 30 '18 at 10:03

0 Answers0