覆盖必须序列化的属性

时间:2013-08-28 08:31:08

标签: c# inheritance xml-serialization

我想知道是否可以覆盖类的成员,但也可以将此属性序列化,就好像它是“原始”属性一样。

要明确我的意思,我会向您展示一小段代码:

class Foo {  
    [System.Xml.Serialization.XmlElementAttribute(Order = 2)]
    public string area;
}
class Bar : Foo {
    [System.Xml.Serialization.XmlElementAttribute(ElementName = "totalArea", Order = 2)]
    public new area{
        get{return "a new implementation of area";}
        set{}
    }
}

class Program {
    public static void main(...) {
        Foo foo = new Bar();
        foo.area = "whatever";
    }
}

所以我想要的是给属性一个新名称。 Ofc我可以简单地将一个新的属性totalArea添加到Bar的类定义中,但如果你处理更大的对象,这会使成员数量增加一倍。此外,由于我不确定给定对象的确切子类,我不知道它是否支持这个额外属性“totalArea”。所以我想简单地使用“area”-attribute,序列化器决定使用哪个属性定义。

这可能吗?

2 个答案:

答案 0 :(得分:0)

只需实现IXmlSerializable类的Foo接口,并使用任何逻辑覆盖WriteXml方法。

答案 1 :(得分:0)

首先,我建议与序列化无关:重新声明成员真的很混乱和相反。这是相关的少数几次之一,如果数据类型在实现之间发生变化,但这不是这种情况。它真的让我觉得virtual会更合适 - 甚至可能它们应该是完全独立的DTO模型。

但是,我们可能会考虑条件序列化;例如:

using System;
using System.ComponentModel;
using System.Xml.Serialization;
public class Foo
{
    [XmlElement("area", Order = 2)]
    public virtual string Area { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public virtual bool ShouldSerializeArea()
    {
        return true;
    }
}
public class Bar : Foo
{
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public override bool ShouldSerializeArea()
    {
        return false;
    }

    [XmlElement("totalArea", Order = 2)]
    public string TotalArea
    {
        get { return Area; }
        set { Area = value; }
    }
}
static class Program
{
    static void Main()
    {
        new XmlSerializer(typeof(Foo)).Serialize(Console.Out, new Foo { Area = "hello" });
        Console.WriteLine();
        new XmlSerializer(typeof(Bar)).Serialize(Console.Out, new Bar { Area = "world" });
    }
}