I'm having a situation here, I need my class to be inherited from List, but when I do this XmlSerializer does not serialize any property or field declared in my class, the following sample demonstrates:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        DoSerialize();
    }
    private void DoSerialize()
    {
        MyClass obj = new MyClass();
        obj.Add(1);
        obj.Add(2);
        obj.Add(3);
        XmlSerializer s = new XmlSerializer(typeof(MyClass));
        StringWriter sw = new StringWriter();
        s.Serialize(sw, obj);
    }
}
[Serializable]
[XmlRoot]
public class MyClass : List
{
    public MyClass()
    {
    }
    int myAttribute = 2011;
    [XmlAttribute]
    public int MyAttribute
    {
        get
        {
            return myAttribute;
        }
        set
        {
            myAttribute = value;
        }
    }
}
the resulting XML:
  1 
  2 
  3 
Answer
This is by design. I don't know why this decision was made, but it is stated in the documentation:
- Classes that implement ICollection or IEnumerable. Only collections are
 
serialized, not public properties.
(Look under "Items that can be serialized" section). Someone has filed a bug against this, but it won't be changed - here, Microsoft also confirms that not including the properties for classes implementing ICollection is in fact the behaviour of XmlSerializer.
A workaround would be to either:
- Implement 
IXmlSerializableand control serialization yourself. 
or
- Change MyClass so it has a public property of type List (and don't subclass it).
 
or
- Use DataContractSerializer, which handles this scenario.
 
No comments:
Post a Comment