Я должен сериализовать несколько объектов, наследуемых от WebControl для хранения базы данных. К ним относятся несколько ненужных (для меня) свойств, которые я бы предпочел исключить из сериализации. Например, BackColor, BorderColor и т. Д.
Вот пример XML-сериализации одного из моих элементов управления, унаследованного от WebControl.
<Control xsi:type="SerializePanel">
<ID>grCont</ID>
<Controls />
<BackColor />
<BorderColor />
<BorderWidth />
<CssClass>grActVid bwText</CssClass>
<ForeColor />
<Height />
<Width />
...
</Control>
Я пытался создать общий базовый класс для своих элементов управления, который наследуется от WebControl и использует трюк "xxx Specified ", чтобы выборочно не сериализовать определенные свойства.
Например, чтобы игнорировать пустое свойство BorderColor, я бы ожидал
[XmlIgnore]
public bool BorderColorSpecified()
{
return !base.BorderColor.IsEmpty;
}
работает, но никогда не вызывается во время сериализации.
Я также пробовал в сериализуемом классе и в базовом классе.
Поскольку сами классы могут измениться, я бы предпочел не создавать собственный сериализатор. Есть идеи?
Редактировать
Я уже использовал XmlAttributeOverrides
, хотя, по-видимому, неправильно. Я не знал, что вы не можете указать базовый класс. Я подправил свою рутину, но она все еще не работает. Вот еще некоторые подробности того, что я пробовал.
У меня есть WebControl с именем Activity, у которого есть ContainerPanel (наследует Panel), который содержит несколько элементов управления типа SerializePanel (также наследует Panel).
Попытка 1
Я добавил атрибуты [XmlIgnore] в новые свойства SerializePanel, не имеет никакого эффекта. Свойство по-прежнему включено в сериализацию.
//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; }
}
Попытка 3
Затем в сериализаторе я передал созданные здесь переопределения:
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>
...