集合属性未序列化为 xml [duplicate]

Collection attributes are not serialized to xml [duplicate]

提问人:ElDog 提问时间:10/27/2023 更新时间:10/27/2023 访问量:30

问:

我有一个自定义的可序列化泛型集合,定义(一个简化的示例),如下所示:

[Serializable]
public class ArrayOfItems<T> : IEnumerable<T>
{
    [XmlAttribute("Setting")]
    public bool Setting { get; set; } = false;

    [XmlAnyElement]
    public List<T> Items { get; set; } = new List<T>();

    public IEnumerator<T> GetEnumerator()
    {
        return Items.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        IEnumerator iterator = ((IEnumerable<T>)this).GetEnumerator();
        while ( iterator.MoveNext() )
        {
            yield return iterator.Current;
        }
    }

    public void Add( T Object )
    {
        Items.Add(Object );
    }
}

我创建一个实例并使用 xml 序列化器对其进行序列化:

ArrayOfItems<int> ints = new();
ints.Items.Add(0);
ints.Items.Add(1);

using (StreamWriter writer = new 
StreamWriter(@"C:\test.xml", false, System.Text.Encoding.Unicode))
{
    XmlSerializer serializer = new(ints.GetType());
    serializer.Serialize(writer, ints);
    writer.Flush();
    writer.Close();
}

这是我得到的文件:

<?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>0</int>
    <int>1</int>
</ArrayOfInt>

有谁明白为什么 bool Setting 属性没有序列化?

C# XML 序列化 XmlSerializer

评论

1赞 dbc 10/27/2023
MSFT 在序列化实现 ICollection 接口的类中显式记录了此限制:当类实现 ICollection 接口时,仅序列化该类包含的集合。添加到类的任何公共属性或字段都不会序列化。(虽然文档只提到 ,但它也适用于。ICollectionIEnumerable
0赞 dbc 10/27/2023
例如,对于相同的问题,请参阅带有 Attribute 的自定义集合 XmlSerialize,其中答案有几种解决方法,例如 Trevor Daniels 的这个答案,它使用包装类来生成所需的 XML,并且看起来是重复的。
0赞 dbc 10/27/2023
另请参阅 Xml 序列化具有属性的集合和当类继承自 List<>时,XmlSerializer 不会序列化其他属性(以及为什么不继承自 List<T>?)。

答: 暂无答案