说我有一个像这样的简单课程
[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?
答案 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] 属性