如何从使用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
都会是第一位的。
您可以在属性中使用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; }
}