我想知道是否可以覆盖类的成员,但也可以将此属性序列化,就好像它是“原始”属性一样。
要明确我的意思,我会向您展示一小段代码:
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,序列化器决定使用哪个属性定义。
这可能吗?
答案 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" });
}
}