【发布时间】:2008-09-25 14:40:28
【问题描述】:
我有一个类用作设置类,该类被序列化为 XML 文件,然后管理员可以对其进行编辑以更改应用程序中的设置。 (设置比App.config 允许的要复杂一些。)
我正在使用XmlSerializer 类来反序列化 XML 文件,我希望它能够设置属性类,但我不希望使用该类/程序集的其他开发人员能够设置/更改通过代码的属性。我可以使用 XmlSerializer 类实现这一点吗?
添加更多细节:这个特定的类是一个集合,根据 FxCop 的说法,XmlSerializer 类对反序列化只读集合具有特殊的支持,但我无法找到更多关于它的信息。这违反的规则的确切细节是:
返回集合的属性应该是只读的,这样用户就不能完全替换后备存储。用户仍然可以通过调用集合上的相关方法来修改集合的内容。请注意,XmlSerializer 类对反序列化只读集合具有特殊支持。有关详细信息,请参阅 XmlSerializer 概述。
这正是我想要的,但它是如何做到的呢?
编辑:好的,我想我在这里有点疯了。就我而言,我所要做的就是在构造函数中初始化 Collection 对象,然后删除属性设置器。然后 XmlSerializable 对象实际上知道使用 Collection 对象中的 Add/AddRange 和 indexer 属性。以下确实有效!
public class MySettings
{
private Collection<MySubSettings> _subSettings;
public MySettings()
{
_subSettings = new Collection<MySubSettings>();
}
public Collection<MySubSettings> SubSettings
{
get { return _subSettings; }
}
}
【问题讨论】:
-
您实际上并没有从您的 SubSettings 属性返回一个只读集合,而是返回一个可以修改的集合。
-
我不明白.. 你以前有什么?我的意思是,那只是阻止人们去 SubSettings = Blah;集合本身实际上不是只读的?
-
@Rob Cooper:在他的代码中,集合不是只读的。他仍然返回一个可变集合,他只是无法更改该类使用的引用。如果这是他的意图,那很好。
-
@Rob Cooper:是的,很抱歉,我的意思是 Collection 属性本身是只读的,我不希望我的班级的消费者重新实例化或修改它,而不是添加内容给它。抱歉,原来的问题不清楚。
-
太棒了,我遇到了完全相同的问题。感谢您更新解决方案!
标签: c# .net xml xml-serialization