下面是一个从WebControl继承的控件的XML序列化示例。
<Control xsi:type="SerializePanel">
<ID>grCont</ID>
<Controls />
<BackColor />
<BorderColor />
<BorderWidth />
<CssClass>grActVid bwText</CssClass>
<ForeColor />
<Height />
<Width />
...
</Control>
我一直在尝试为我的控件创建一个公共基类,它继承自WebControl并使用“xxx
Specified
[XmlIgnore]
public bool BorderColorSpecified()
{
return !base.BorderColor.IsEmpty;
}
但在序列化过程中从未调用它。
因为类本身可能会更改,所以我不希望必须创建自定义序列化程序。有什么想法吗?
编辑
:
XmlAttributeOverrides
但显然不正确。我不知道你不能指定基类。我调整了我的程序,但仍然不起作用。以下是我尝试过的一些细节。
我有一个名为Activity的WebControl,它有一个ContainerPanel(inherits Panel),其中包含几个SerializePanel类型的控件(也有inherits Panel)。
我向SerializePanel的新属性添加了[XmlIgnore]属性,但没有效果。该属性仍包含在序列化中。
//This is ignored
[XmlIgnore]
public new System.Drawing.Color BackColor{
get { return base.BackColor; }
set { }}
尝试2
我还尝试了SerializePanel声明中指定的*,但被忽略了
public bool BackColorSpecified
{
get { return !base.BackColor.IsEmpty; }
}
然后在序列化程序中,我传递了在此处创建的覆盖:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
string[] serPAnelProps = { "BackColor", "BorderColor", "ForeColor", "Site", "Page", "Parent", "TemplateControl", "AppRelativeTemplateSourceDirectory" };
foreach (string strAttr in serPAnelProps)
{
XmlAttributes ignoreAtrs = new XmlAttributes();
ignoreAtrs.XmlIgnore = true;
overrides.Add(typeof(SerializePanel), strAttr, ignoreAtrs);
}
string[] ignoreProps = { "Site", "Page", "Parent", "TemplateControl", "AppRelativeTemplateSourceDirectory" };
foreach (string strAttr in ignoreProps)
{
XmlAttributes ignoreAtrs = new XmlAttributes();
ignoreAtrs.XmlIgnore = true;
overrides.Add(typeof(System.Web.UI.Control), strAttr, ignoreAtrs);
}
注意:为了能够序列化控件,必须向System.Web.UI.Control类型添加属性。
每次尝试的结果XML片段都是
<Activity....>
...
<ContainerPanel>
<ID>actPnl_grAct207_0</ID>
- <Controls>
- <Control xsi:type="SerializePanel">
<ID>grCont</ID>
<Controls />
<BackColor />
<BorderColor />
<BorderWidth />
<CssClass>grActVid</CssClass>
<ForeColor />
<Height />
<Width />
<WidthUnitType>Pixel</WidthUnitType>
<HeightUnitType>Pixel</HeightUnitType>
<WidthUnit>0</WidthUnit>
<HeightUnit>0</HeightUnit>
</Control>
...