具有私有setter的XmlSerializer和Collection属性

时间:2009-05-21 05:03:00

标签: .net xml-serialization

说我有一个像这样的简单课程

[Serializeable]
public class MyClass
{
    public MyClass()
    {
       this.MyCollection = new List<int>();
    }


    public List<int> MyCollection { get; private set;}
}

如果我尝试使用XmlSerializer反序列化,我会收到一条错误消息,指出MyCollection是只读的,无法分配给。但是我不想公开setter,因为如果类的用户分配了它会导致各种问题。 FxCop正确警告:Collection properties should be read only

但是在社区页面底部添加的内容是:

  

XmlSerializer了解只读   收藏品   属性不一定是   XmlSerializer的读写   序列化和反序列化内容   正确。 XmlSerializer看起来   对于名为Add on collection的方法   实现ICollection的属性   或IEnumerable,并使用它   填充集合时   反序列化所有者的实例   类型。

然而它似乎并非如此(因为我得到了InvalidOperationException)。我能做什么遵循保持属性设置器私有的最佳实践,同时仍允许我使用XmlSerializer?

2 个答案:

答案 0 :(得分:14)

您的私人制定者造成了这个问题。 XmlSerializer类可以正常使用我在下面给出的类。 XmlSerializer类是在引入私有setter之前发明的,因此在使用反射扫描类类型时可能无法正确检查。也许您应该将此报告给Microsoft作为错误。

public class MyClass
{
    private List<int> _myCollection;

    public MyClass()
    {
        _myCollection = new List<int>();
    }

    public List<int> MyCollection
    {
        get
        {
            return this._myCollection;
        }
    }
}

答案 1 :(得分:0)

您必须使用 [XmlIgnore] 属性