如何从使用DataContractAttribute的类中提取基类而不引入重大更改?

时间:2015-08-18 08:40:46

标签: c# .net datacontractserializer

我有一个使用DataContract序列化持久化的设置类。现在我想将一些属性提取到基类,但这会更改生成的xml中的条目顺序并中断反序列化。我发现这很令人惊讶,因为所有字段和类名都是相同的。将旧文件读入新结构的最简单方法是什么?

编辑:设置订单不起作用。基类params总是先行,然后是派生成员。

e.g。

    [DataContract]
    public class MyClass
    {
        [DataMember]
        public string A { get; set; }

        [DataMember]
        public string B { get; set; }

        [DataMember]
        public string C { get; set; }
    }

A, B, C

的顺序输出参数

现在,如果我做到了

[DataContract]
public abstract class MyBaseClass
{
    [DataMember]
    public string C { get; set; }
}

[DataContract]
public class MyClass : MyBaseClass
{
    [DataMember]
    public string A { get; set; }

    [DataMember]
    public string B { get; set; }
}

订单为C, A, B。无论我为订单付出什么,C都是第一位的。

3 个答案:

答案 0 :(得分:0)

您可以使用Order in属性 例如[DataMember(Order = 0)]

答案 1 :(得分:0)

您应该明确设置顺序:

[DataContract]
public class BaseType
{
    [DataMember]
    public string zebra;
}

[DataContract]
public class DerivedType : BaseType
{
    [DataMember(Order = 0)]
    public string bird;
    [DataMember(Order = 1)]
    public string parrot;
    [DataMember]
    public string dog;
    [DataMember(Order = 3)]
    public string antelope;
    [DataMember]
    public string cat;
    [DataMember(Order = 1)]
    public string albatross;
}

请参阅 - MSDN - Data Member Order

答案 2 :(得分:0)

我想到的一个解决方案是覆盖派生类中的成员以维护原始顺序。 (可选)在派生类型中使用顺序。 问题是你不能覆盖字段,因此我会尝试将它们更改为属性。使用公共get和set方法创建所有属性应该没有区别(尽管我不是100%确定你的情况)。

[DataContract]
public class BaseType
{
    [DataMember]
    public virtual string zebra { get; set; }
}


[DataContract]
public class DerivedType : BaseType
{
    [DataMember]
    public override string zebra { get; set; }
    [DataMember]
    public string bird { get; set; }
    [DataMember]
    public string parrot { get; set; }
    [DataMember]
    public string dog { get; set; }
    [DataMember]
    public string antelope { get; set; }
    [DataMember]
    public string cat { get; set; }
    [DataMember]
    public string albatross { get; set; }
}
相关问题