代码之家  ›  专栏  ›  技术社区  ›  Laramie

省略WebControl序列化中的属性

  •  0
  • Laramie  · 技术社区  · 14 年前

    下面是一个从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>
    ...
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Thomas Levesque    14 年前

    XXXSpecified 必须是属性,而不是方法:

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

    XmlIgnore 属性是不必要的,因为只读属性没有序列化(无论如何,它是代码中的一个方法)

    或者,您可以使用 ShouldSerializeXXX 而不是 财产


    编辑:

    根据马克的回答 诡计在这里行不通。。。

    但是,您还有另一个选择: 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);