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

Esa*_*aty 19 .net c# ienumerable list xml-serialization

我在这里有一个情况,我需要继承自己的类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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果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>
Run Code Online (Sandbox Code Playgroud)

dri*_*iis 24

这是设计的.我不知道为什么做出这个决定,但是在文件中说明了这一点:

  • 实现ICollection或IEnumerable的类.只有集合是序列化的,而不是公共属性.

(查看"可以序列化的项目"部分).有人提出了一个针对此的错误,但它不会被更改 - 在这里,微软也确认不包括实现类的属性ICollection实际上是XmlSerializer的行为.

解决方法是:

  • IXmlSerializable自己实现和控制序列化.

要么

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

要么

  • 使用DataContractSerializer处理此方案.


小智 5

这里有一个虽然供您考虑。

你可以有一个像这样的容器类:

class ContainerObject
{
     public int MyNewProperty { get; set; }

     [XmlElement("")]
     public List<int> MyList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

诀窍是在 List 元素上方设置 XmlElement name = ""。

当它被序列化为 xml 时,您将拥有:

<ContainerObject>
   <MyNewProperty>...</MyNewProperty>

   <int>...</int>
   <int>...</int>

</ContainerObject>
Run Code Online (Sandbox Code Playgroud)

如果您愿意,还可以为列表中的项目创建另一个类

 class MyItem
 {
     public int MyProperty {get;set;} 

 } 
Run Code Online (Sandbox Code Playgroud)

然后不是有整数列表,而是有一个 MyItem 列表。

这是您控制列表中每个项目的 XmlElement 名称。

我希望这可以帮到你。