Мне нужно сериализовать несколько объектов, наследующих WebControl для хранения базы данных. К ним относятся несколько ненужных (для меня) свойств, которые я предпочел бы опустить из сериализации. Например, BackColor, BorderColor и т. Д.Опустить свойства из WebControl Сериализация
Ниже приведен пример сериализации XML одного из моих элементов управления, наследуемых от WebControl.
<Control xsi:type="SerializePanel">
<ID>grCont</ID>
<Controls />
<BackColor />
<BorderColor />
<BorderWidth />
<CssClass>grActVid bwText</CssClass>
<ForeColor />
<Height />
<Width />
...
</Control>
Я пытался создать общий базовый класс для моего управления, который наследуется от WebControl и использует «ххх Specified» трюк, чтобы избирательно выбирать не сериализовать определенные свойства.
Например, чтобы игнорировать пустое свойство BorderColor, я бы ожидать
[XmlIgnore]
public bool BorderColorSpecified()
{
return !base.BorderColor.IsEmpty;
}
работать, но это никогда не вызывается во время сериализации.
Я также пробовал его в классе, который будет сериализован, а также базовом классе.
Поскольку сами классы могут меняться, я бы предпочел не создавать собственный сериализатор. Есть идеи?
Edit:
Я уже использовал 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>
...
Я очень ценю ваши идеи. К сожалению, у меня все еще есть проблемы, которые, как я подозреваю, связаны с тем, что у меня есть вложенные элементы управления, хотя на этот раз это просто догадка. Интересно, можете ли вы присмотреть за тем, что еще не так. См. Редактирование вопроса. – Laramie
@Laramie, вам нужно указать атрибут для типа, на котором определено свойство. Например, BackColor определяется в WebControl, а не в Control. Поэтому вы должны написать 'overrides.Add (typeof (WebControl), strAttr, ignoreAtrs)' –
Это имеет смысл. Работает отлично для всех объектов, наследующих WebControl, но я до сих пор не вижу способа выборочного выбора, какие типы, которые наследуют WebControl, должны иметь свои свойства, сериализованные. Если я создаю ** общедоступное новое свойство System.Drawing.Color BackColor ** для типа наследования типа SerializePanel и устанавливаю ** overrides.Add (typeof (SerializePanel), «BackColor», ignoreAtrs) ** BackColor по-прежнему сериализуется. – Laramie