XmlSerializer doesn't serialize everything in my class

旧巷老猫 提交于 2019-12-23 02:17:54

问题


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.


回答1:


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.




回答2:


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:


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

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


来源:https://stackoverflow.com/questions/1797947/xmlserializer-doesnt-serialize-everything-in-my-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!