0

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

为了清楚我的意思,我向您展示了一小段代码:

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”。所以我想简单地使用“区域”属性,序列化程序决定使用哪个属性定义。

这可能吗?

4

2 回答 2

0

只需实现类IXmlSerializable接口并使用您想要的任何逻辑Foo覆盖方法即可。WriteXml

于 2013-08-28T08:39:18.887 回答
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" });
    }
}
于 2013-08-28T09:13:25.307 回答