Пропустить свойства из сериализации WebControl - PullRequest
0 голосов
/ 14 июня 2010

Я должен сериализовать несколько объектов, наследуемых от 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>
...

1 Ответ

0 голосов
/ 14 июня 2010

XXXSpecified должно быть свойством, а не методом:

public bool BorderColorSpecified
{
    get { return !base.BorderColor.IsEmpty; }
}

Кроме того, атрибут XmlIgnore не нужен, поскольку свойство только для чтения не сериализуется (и в любом случае это был методв вашем коде)

В качестве альтернативы вы можете использовать ShouldSerializeXXX метод вместо XXXSpecified свойства


РЕДАКТИРОВАТЬ:

Согласно ответу Марка, уловка XXXSpecified здесь не сработает ...

Однако вам доступна еще одна опция: класс XmlAttributeOverrides.Это позволяет вам настраивать сериализацию без изменения кода класса:

XmlAttributeOverrides overrides = new XmlAttributeOverrides();

// Ignore the BackColor property
XmlAttributes attributesBackColor = new XmlAttributes();
attributesBackColor.XmlIgnore = true;
overrides.Add(typeof(WebControl), "BackColor", attributesBackColor);

// do the same for other properties to ignore...

XmlSerializer xs = new XmlSerializer(typeof(YourControl), overrides);

Этот подход, вероятно, лучше, потому что вам не нужно создавать общий базовый класс для ваших элементов управления.Кроме того, вам не нужно загрязнять свои классы новыми открытыми членами, которые не служат никакой цели, кроме сериализации

...