一尘不染

当从List <>继承一个类时,XmlSerializer不会序列化其他属性

c#

我在这里遇到一种情况,我需要从继承我的类List<ItemType>,但是当我这样做时,XmlSerializer不会序列化我类中声明的任何属性或字段,下面的示例演示:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        DoSerialize();
    }
    private void DoSerialize()
    {
        MyClass obj = new MyClass();
        obj.Add(1);
        obj.Add(2);
        obj.Add(3);
        XmlSerializer s = new XmlSerializer(typeof(MyClass));
        StringWriter sw = new StringWriter();
        s.Serialize(sw, obj);
    }
}
[Serializable]
[XmlRoot]
public class MyClass : List<int>
{
    public MyClass()
    {
    }
    int myAttribute = 2011;
    [XmlAttribute]
    public int MyAttribute
    {
        get
        {
            return myAttribute;
        }
        set
        {
            myAttribute = value;
        }
    }
}

产生的XML:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <int>1</int>
  <int>2</int>
  <int>3</int>
</ArrayOfInt>

阅读 347

收藏
2020-05-19

共1个答案

一尘不染

这是设计使然。我不知道为什么要做出这个决定,但是它在文档中说明

  • 实现ICollection或IEnumerable的类。仅集合是序列化的,不是公共属性。

(在“可以序列化的项目”部分下查找)。有人对此提出了一个错误,但不会更改
-在这里,Microsoft还确认不包括实现类的属性ICollection实际上是XmlSerializer的行为。

解决方法是:

  • IXmlSerializable自己实施和控制序列化。

要么

  • 更改MyClass,使其具有List类型的公共属性(并且不要对其进行子类化)。

要么

  • 使用DataContractSerializer,它可以处理这种情况。
2020-05-19