序列化具有不同属性名称的Abstract类

时间:2013-08-29 09:19:37

标签: c# serialization

在导出流程上,我有一些XML元素代表相同的东西,但名称不同。我无法更改这些名称,因为它们是由其他软件定义的。

我需要这样的东西:

<class1>
  <MY_FIELD></MY_FIELD>
</class1>

<class2>
  <my_field></my_field>
</class2>

由于需要在两个字段上进行的处理相同,我想创建一个包含它的抽象类。

现在,这就是我所拥有的:

public abstract class MyAbstract
{
    [XmlAttribute("MY_FIELD")]
    public MyField {get;set;}
}

[Serializable]
public class Class1 : MyAbstract
{
}

[Serializable]
public class Class2 : MyAbstract
{
}

有没有办法在最终课程XmlAttributeclass1上指定不同的class2,以便我可以在MyField上设置属性?

修改: 我正在尝试使用XmlAttributeOverrides,这似乎做了我想做的事,但我无法使其发挥作用。我不知道我错过了什么。

var myType = typeof(Class1);
var overrides = new XmlAttributeOverrides();
var attrs = new XmlAttributes
{
  XmlAttribute = new XmlAttributeAttribute("test")
};
overrides.Add(myType, "MyField",attrs);

和序列化器

var serializer = new XmlSerializer(myType, overrides);

EDIT2 : 最后,我最终删除了我的抽象类上的属性,并在每个类上添加一个getter用于序列化目的。这很糟糕,但我仍然希望有人可以给我一个合适的选择。

1 个答案:

答案 0 :(得分:0)

尝试

public abstract class MyAbstract
{
    abstract public MyField {get;set;}
}

[Serializable]
public class Class1 : MyAbstract
{
    [XmlAttribute("MY_FIELD")]
    public override MyField {get;set;}
}

[Serializable]
public class Class2 : MyAbstract
{
    [XmlAttribute("my_field")]
    public override MyField {get;set;}
}