Sunday 29 December 2019

c# - When a class is inherited from List, XmlSerializer doesn't serialize other attributes



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 IXmlSerializable and 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

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...