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

本文关键字:基类 中断 提取 DataContractAttribute | 更新日期: 2023-09-27 18:08:22

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

编辑:设置顺序无效。基类参数总是排在第一位,然后是派生成员。

例如

    [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都会是第一位的。

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

您可以在属性中使用Order例如[DataMember(Order=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-数据成员订单

我想到的一个解决方案是覆盖派生类中的成员以维持原始顺序。也可以选择在派生类型中使用order。问题是您无法覆盖字段,因此我会尝试将它们更改为属性。使用公共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; }
}