如何使用继承或子类对象在DataContract序列化程序中订购数据成员/属性?

时间:2012-02-07 04:14:02

标签: c# serialization datacontract datacontractserializer

我遇到的问题是DataContract Serializer没有按照所需的顺序呈现数据成员或属性。我有一个数据合同装饰类,它继承自另一个数据合同装饰类,例如它是父项的子项,并指定特定属性的排序顺序。

我不确定是否需要使用特殊配置设置或如何实现此功能,即使它需要自定义排序例程。

基本上,当序列化输出时,我希望“ParentResource”中的某些属性出现在“ChildResource”的某些属性之前。

序列化表示中的理想属性排序:   - ParentProperty1   - ParentProperty2   - ChildProperty1   - ChildProperty2

序列化表示中的当前属性排序:   - ChildProperty1   - ChildProperty2   - ParentProperty1   - ParentProperty2

using System.Runtime.Serialization;
namespace DataContractSerializationOrderingError
{
[DataContract]
[KnownType(typeof(ParentResource))]
public class ChildResource : ParentResource
{
    [DataMember(EmitDefaultValue = false)]
    public int ChildProperty1 { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public int ChildProperty2 { get; set; } 
}

[DataContract]
public class ParentResource
{
    [DataMember(EmitDefaultValue = false, Order = 0)]
    public int ParentProperty1 { get; set; }

    [DataMember(EmitDefaultValue = false, Order = 1)]
    public int ParentProperty2 { get; set; }
}

}

1 个答案:

答案 0 :(得分:1)

你想要的是DataMember.Order

public class ChildResource : ParentResource
{
    [DataMember(EmitDefaultValue = false, Order = 2)]
    public int ChildProperty1 { get; set; }

    [DataMember(EmitDefaultValue = false, Order = 3)]
    public int ChildProperty2 { get; set; } 
}