Why isn't my public property serialized by the XmlSerializer?

Solution 1:

As mentioned, most properties must have both a getter and setter; the main exception to this is lists - for example:

private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine

which will work fine; however, if XmlSerializer finds a setter - it demands that it is public; the following will not work:

public List<Foo> Bar {get; private set;} // FAIL

Other reasons it might not serialize:

  • it isn't public with get and set (or is readonly for a field)
  • it has a [DefaultValue] attribute, and is with that value
  • it has a public bool ShouldSerializeFoo() method that returned false
  • it has a public bool FooSpecified {get;set;} property or field that returned false
  • it is marked [XmlIgnore]
  • it is marked [Obsolete]

Any of these will cause it not to serialize

Solution 2:

The point about getter+setter is made in the 3rd paragraph on the "Intro to Xml Serialization" page. It's actually in a call-out box. Can't miss it!

Intro-to-XML Serialization http://www.freeimagehosting.net/uploads/2f04fea2db.png

(having a little too much fun with Freeimagehosting.net)

Solution 3:

Also properties that return null are not serialized!

Solution 4:

if you don't want to implement proper Setters (because maybe you are neither wanting to deserialize or change an objects value) you can just use dummy setters like this set { }, so that the XMLSerializer works, but nothing happens if you use the Setter...

i.E.

public string ID { get { return _item.ID.ToString(); } set { } }

Solution 5:

One more thing to add about serialization of collections:

The XmlSerializer ignores collections of interfaces!

And by that I mean ignore. While you will get an exception for a line like:

public IFoo Foo { get; set; }

you will not get an exception for:

public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }