如何将XML文件反序列化为具有只读属性的类?

时间:2008-09-25 14:40:28

标签: c# .net xml xml-serialization

我有一个我正在使用的类作为设置类,该类被序列化为XML文件,管理员可以编辑该文件以更改应用程序中的设置。 (这些设置比App.config允许的要复杂一点。)

我正在使用XmlSerializer类来反序列化XML文件,我希望它能够设置属性类,但我不希望使用类/程序集的其他开发人员能够设置/更改属性通过代码。我可以使用XmlSerializer类实现这一点吗?

添加更多细节:这个特定的类是一个Collection,根据FxCop,XmlSerializer类特别支持反序列化只读集合,但是我还没有找到更多信息。违反规则的具体细节是:

  

返回集合的属性应该是只读的,以便用户无法完全替换后备存储。用户仍然可以通过调用集合上的相关方法来修改集合的内容。请注意,XmlSerializer类特别支持反序列化只读集合。有关详细信息,请参阅XmlSerializer概述。

这正是我想要的,但它是如何做到的?

编辑:好的,我想我在这里有点疯狂。在我的例子中,我所要做的就是在构造函数中初始化Collection对象,然后删除属性setter。然后,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; }
    }
}

4 个答案:

答案 0 :(得分:4)

您必须使用可变列表类型,如ArrayList(或IList IIRC)。

答案 1 :(得分:1)

我认为你不能使用自动序列化,因为该属性是只读的。

我的行动方针是实施ISerializable界面并手动完成。您可以从此处设置内部值。

但是,如果您的子对象(以只读方式公开)可以自己进行序列化,那么它应该只能工作..

我认为FxCop的规则是抱怨你有类似的东西:

public List<MyObject> Collection
{
   get { return _collection; }
   set { _collection = value; }
}

不是吗?如果没有,你可以粘贴一些代码,这样我就可以看到你到底在做什么了吗?有几种方法可以完成上述所有操作:)

答案 2 :(得分:1)

@Rob Cooper说得对,只需实现ISerializable界面,您就可以自定义控制类的序列化和反序列化以及手动设置字段。这是一个更多的腿部工作,但它将实现您的预​​期目标。祝你好运。

答案 3 :(得分:0)

@ leppie的回应实际上是最接近的。这是XmlSerializer文档中的实际相关文本,有关详细信息,请参阅我对上述问题的编辑:

  

XmlSerializer为实现IEnumerable或ICollection的类提供特殊处理。实现IEnumerable的类必须实现一个带有单个参数的公共Add方法。 Add方法的参数必须与从GetEnumerator返回的值的Current属性返回的类型相同,或者该类型的base之一。除了IEnumerable之外,实现ICollection(例如CollectionBase)的类必须具有一个公共Item索引属性(C#中的索引器),该属性采用整数,并且它必须具有integer类型的公共Count属性。 Add方法的参数必须与Item属性返回的类型相同,或者是该类型的基础之一。对于实现ICollection的类,要从序列化的Item属性中检索要序列化的值,而不是通过调用GetEnumerator。