.net 具有专用setter的XmlSerializer和集合属性

.net 具有专用setter的XmlSerializer和集合属性,.net,xml-serialization,.net,Xml Serialization,假设我有这样一个简单的类 [Serializeable] public class MyClass { public MyClass() { this.MyCollection = new List<int>(); } public List<int> MyCollection { get; private set;} } [可序列化] 公共类MyClass { 公共MyClass() { this.MyCollecti

假设我有这样一个简单的类

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


    public List<int> MyCollection { get; private set;}
}
[可序列化]
公共类MyClass
{
公共MyClass()
{
this.MyCollection=新列表();
}
公共列表MyCollection{get;private set;}
}
如果我尝试使用XmlSerializer反序列化,我会得到一个错误,说明MyCollection是只读的,无法分配给。但是,我不想公开setter,因为如果类的用户分配给它,这可能会导致各种问题。FxCop对此提出了正确的警告:

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

XmlSerializer理解只读 收藏 属性不必是 XmlSerializer的读写操作 序列化和反序列化内容 正确地XmlSerializer将显示 对于名为Add-on-collection的方法 实现ICollection的属性 或者IEnumerable,并用它来 在以下情况下填充集合: 反序列化所有者的实例 类型


然而,情况似乎并非如此(因为我得到了InvalidoOperationException)。我能做些什么来遵守保持属性setter私有化的最佳实践,同时仍然允许我使用XmlSerializer?

您的私有setter导致了这个问题。XmlSerializer类将与我在下面给出的类配合使用。XmlSerializer类是在引入私有setter之前发明的,因此当它使用反射扫描类类型时,可能没有正确检查。也许你应该向微软报告这是一个bug

public class MyClass
{
    private List<int> _myCollection;

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

    public List<int> MyCollection
    {
        get
        {
            return this._myCollection;
        }
    }
}
公共类MyClass
{
私人名单(我的收藏);;
公共MyClass()
{
_myCollection=新列表();
}
公开名单收集
{
得到
{
把这个还给我;
}
}
}

您必须使用[XmlIgnore]属性

此错误(功能?)仍然存在于.NET 4中:(