简体   繁体   中英

XmlSerializer doesn't serialize everything in my class

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(); } 

[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(); }

 [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.

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.

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM