http://blog2.impx.net/dragonimp/archive/2005/03/26/735.html
一般情况下,一个类只要加上Serializable 特性进行声明就可以作为这样的配置类了:
[Serializable ]
public class BlogConfigurationSettings
但仍然要注意几点:interface和abstract class不能作为配置类;类必须要有不带参数的公共构造函数;要作为配置参数的字段或者属性必须是public 的,而属性必须有set。
默认情况下,Xml序列化会把类中的字段或者属性序列化成xmlElement
note: from envykok
so :
public AAA BlogProviders
{
get {return this._blogProviders;}
set {this._blogProviders = value;}
}
is equal to
[XmlElement]
public AAA BlogProviders
{
get {return this._blogProviders;}
set {this._blogProviders = value;}
}
--aslo, xml note name will be type name =AAA
比如上面的BlogProviders ,但有些时候,可能要使用xml Attribute,比如:
<Tracking enableAggBugs = "true" …
这种情况,需要使用XmlAttributeAttribute 来声明:
[XmlAttribute("enableAggBugs")]
public bool EnableAggBugs
多数情况下,我们定义的配置类应该已经足够,但偶尔有些时候,我们需要在配置文件中增加配置元素或者配置属性,但又不能或者不想修改已有的配置类,为了避免反序列化的时候出错,也为了增强灵活性,应该给配置类增加这样两个属性:
[XmlAnyAttribute ]
public XmlAttribute[] XmlAttributes
[XmlAnyElement ]
public XmlElement[] XmlElements
note: from envykok
so, we can directly add any kind of xmlelement into this array,
for example : we can add "<a href='http://www.envykok.com'/>" to class BlogConfigurationSettings
这是告诉XmlSerializer,如果有不可识别的元素或者属性,则将其放到这样两个数组 中,程序可以从数组中检索相应的设置。
<EntryHandlers>
<EntryHandler type="..." postType = "Comment" processAction ="Insert" processState="PreCommit" isAsync="false" />
...
</EntryHandlers>
[XmlArray ("EntryHandlers")]
public EntryHandler[] EntryHandlers
这样就可以定义数组参数。如果数组的元素不是同样的类型 ,但都继承自一个基类,那还可以这样定义:
<Validators>
<RegularExpressionValidator Name="Email" ...
<DateValidator Name="Date" ...
...
</Validators>
[XmlArray("Validators")]
[
XmlArrayItem ("Validator ", typeof(Nss.Data.Validators.Validator))
,
XmlArrayItem ("RegularExpressionValidator ", typeof(Nss.Data.Validators.RegularExpressionValidator))
]
public Nss.Data.Validators.Validator[] Validators;
XmlArray定义了数组,而XmlArrayItem定义了数组中可以使用的元素类型,使得系统的配置更加灵活,结构也更清晰。