2
votes

I have a very basic class that is a list of sub-classes, plus some summary data.

[Serializable]
public class ProductCollection : List<Product>
{
    public bool flag { get; set; }
    public double A { get; set; }
    public double B { get; set; }
    public double C { get; set; }
}


// method to save this class
private void SaveProductCollection()
{
    // Export case as XML...
    XmlSerializer xml = new XmlSerializer(typeof(ProductCollection));
    StreamWriter sw = new StreamWriter("output.xml");
    xml.Serialize(sw, theCollection);
    sw.Close();
}

When I call SaveProductCollection() I get the following:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfProduct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Product>
    <InputType>1</InputType>
  </Product>
  <Product>
    <InputType>1</InputType>
  </Product>
</ArrayOfProduct>

Note that I have the base type : List<Product>. But I don't have any of the class properties: flag, A, B, C.

Did I do something wrong? What's up??

UPDATE Thanks for the replies. I wasn't aware that it was by-design. I've converted to BinaryFormatter (for binary serialization instead) and it works wonderfully.

3

3 Answers

7
votes

Following msdn:

Q: Why aren't all properties of collection classes serialized?

A: The XmlSerializer only serializes the elements in the collection when it detects either the IEnumerable or the ICollection interface. This behavior is by design. The only work around is to re-factor the custom collection into two classes, one of which exposes the properties including one of the pure collection types.

0
votes

First of all, when making your own collection types, you should inherit System.Collections.ObjectModel.Collection<T>, which will allow you to override InsertItem and other methods to gain complete control over the collection.

To answer your question, XmlSerializer handles collection types differently to serialize the items in the collection. It will not serialize any properties (eg, List<T>.Capacity).

You could move your properties to a different type that would contain the properties or the collection.

You could also try using the attributes that control XML serialization, but I'm not sure whether they'll help.

-3
votes

Try adding XmlAttribute to your properties, so they'll be serialized as attributes. Something like:

 [XmlAttribute("flag")]
 public bool flag { get; set; }