XmlSerializer and CollectionBase

I just want to share some things that I have learned while fighting with getting an XML fragment to deserialize into a CollectionBase derived object. What a nightmare!

The XML fragment is similar to the following:

    <item name='name1' uri='uri1'/>
    <item name='name2' uri='uri2'/>

I first start off with the way that every other class works:

public class ItemCollection : CollectionBase
    ... Complete implementation of a typed collection ...
    ... including typed Add method and indexer ...

public class Item
    ... Implementation of Item properties ...

This gives the very cryptic error along the lines of there was an error reflecting ItemCollection. Finally, after some digging, I come across the real cause of the error. XML attributes are not allowed on the type ItemCollection. Why would that be the case? Who knows?

No problem, I think as I remove the XmlRoot attribute from ItemCollection. At this point, Im no longer receiving errors. However, none of my items are being deserialized. Argh!

So, finally I discover the XmlArray and XmlArrayItem elements, which seem to do the trick. The drawback is that I have to have a container class, as these attributes can’t be applied to a class. Not necessarily my first choice, but, I suppose it will do.

Final chunk of code:

public class DataContainer
    [XmlArrayItem("item", typeof(Item))]
    public ItemCollection Items
        get { return _items; }
        set { _items = value; }

All in all, I dont see why the serialization of collections is so different for collections as opposed to other classes.