DataContractSerialization和新关键字继承

时间:2012-09-30 07:07:43

标签: c# inheritance serialization xml-serialization datacontractserializer

我遇到一个问题,即由于new关键字,XML元素“Event”被序列化了两次。我希望派生类型只能被序列化。

[DataContract(Name = "Division", Namespace = "")]
    public class ApiTeamDivision : ApiDivision
    {
        [DataMember]
        public new ApiTeamEvent Event { get; set; }
        [JsonIgnore]
        public new ApiDivisionSettings Settings { get; set; }
        [JsonIgnore]
        public new List<ApiPrice> Prices { get; set; }
        [JsonIgnore]
        public new List<ApiTeam> Teams { get; set; }
        [JsonIgnore]
        public new List<ApiAsset> Assets { get; set; }
        [JsonIgnore]
        public new List<ApiBracket> Brackets { get; set; }
    }   

<Division>
<Age>17</Age>
<Event i:nil="true"/>
<Event>
   <Address i:nil="true"/>
   <Assets i:nil="true"/>
   <Description i:nil="true"/>
   <Divisions i:nil="true"/>
</Event>
</Division>

1 个答案:

答案 0 :(得分:1)

请勿在基类[DataMember]

中的Event属性上标记ApiDivision
class ApiDivision
{
    //[DataMember] => don't mark this
    public new ApiTeamEvent Event { get; set; }
}

如果您使用[DataContract],则无需使用属性[JsonIgnore],因为它用于以下两种格式:json和Xml。

因此,如果您想忽略序列化中的属性,请不要使用属性[DataMember]

标记它
[DataContract(Name = "Division", Namespace = "")]
public class ApiTeamDivision : ApiDivision
{
    [DataMember]
    public new ApiTeamEvent Event { get; set; }

    public new ApiDivisionSettings Settings { get; set; }

    public new List<ApiPrice> Prices { get; set; }

    public new List<ApiTeam> Teams { get; set; }

    public new List<ApiAsset> Assets { get; set; }

    public new List<ApiBracket> Brackets { get; set; }
}

修改

或者您可以使用(IsRequired=false, EmitDefaultValue=false)来忽略属性是null

class ApiDivision
{
    [DataMember(IsRequired=false, EmitDefaultValue=false)]
    public new ApiTeamEvent Event { get; set; }
}