我有一个使用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
都是第一位的。
答案 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; }
}