2016-03-27 26 views
3

我在我的項目中使用JsonConvert爲了從我的對象,使一個json字符串,但奇怪的事情發生,其中一個實體丟失過程中的數據,這很奇怪,因爲當我調試時,實體具有值,但由於某種原因,它會在此過程中丟失。序列化與JsonConvert丟失數據

我使用JsonConvert.SerializeObject方法,這是我的實體,失去的數據:

[DataContract] 
public class MediaDTO : BaseEntityDTO 
{ 
    [DataMember(IsRequired = true)] 
    public int Id { get; set; } 

    [DataMember(IsRequired = true)] 
    public bool IsAlive { get; set; } 

    [DataMember(IsRequired = true)] 
    public string Description { get; set; } 

    [DataMember(IsRequired = true)] 
    public PidDTO Pid { get; set; } 
} 

[DataContract] 
public class BaseEntityDTO 
{ 
    [DataMember(IsRequired = true)] 
    public bool IsDeleted { get; set; } 

    [DataMember(IsRequired = true)] 
    public DateTime AddedDate { get; set; } 

    [DataMember(IsRequired = true)] 
    public DateTime UpdatedDate { get; set; } 
} 

public class PidDTO : BaseEntityDTO 
{ 
    public string PidId { get; set; } 
    public VidDTO Vid { get; set; } 
    public string Name { get; set; } 
    public virtual bool IsFromUser { get; set; } 
} 

public VidDTO : BaseEntityDTO 
{ 
    public virtual string VidId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual bool IsFromUser { get; set; } 
} 

現在,當我看json,我看到所有從BaseEntityDTO類的屬性,但而不是該類本身的其他屬性。

任何想法爲什麼,是否存在與實體或類似的問題?

+1

如果您提供一個簡短但完整的程序來展示問題,那將會更容易幫助您。見[mcve]。 –

+0

你是如何去反序列化它? – Aizen

+0

@Aizen重要嗎?在搜索之後json是錯誤的。 – Pachu

回答

3

問題是您的PidDTOVidDTO類型的屬性未被序列化。這是因爲它們的基本類型BaseEntityDTO標有[DataContract],數據合同序列號是選擇加入

解決方案也與[DataContract],以紀念這些派生類型,然後選取您要與[DataMember]序列化的所有成員:

[DataContract] 
public class PidDTO : BaseEntityDTO 
{ 
    [DataMember] 
    public string PidId { get; set; } 
    [DataMember] 
    public VidDTO Vid { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public virtual bool IsFromUser { get; set; } 
} 

[DataContract] 
public class VidDTO : BaseEntityDTO 
{ 
    [DataMember] 
    public virtual string VidId { get; set; } 
    [DataMember] 
    public virtual string Name { get; set; } 
    [DataMember] 
    public virtual bool IsFromUser { get; set; } 
} 

爲什麼這應該是必要的嗎?從理論上講,DataContractAttribute存在適用於基類應該不會影響你的派生類型,因爲DataContractAttribute sets AttributeUsageAttribute.Inherited = false

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Struct|AttributeTargets.Enum, Inherited = false, 
AllowMultiple = false)] 
public sealed class DataContractAttribute : Attribute 

然而,Json.NET不尊重的DataContractAttributeInherited = false屬性,可將所有派生類型一個數據合同類型爲具有選入串行化,作爲解釋here

[Json.NET]檢測在基類DataContractAttribute並假定選擇在序列化。

因此,您需要添加這些屬性。

或者,如果你只使用數據契約屬性設置IsRequired = true,你可以切換到使用[JsonProperty(Required = Required.AllowNull)]代替:

public class MediaDTO : BaseEntityDTO 
{ 
    [JsonProperty(Required = Required.AllowNull)] 
    public int Id { get; set; } 

    [JsonProperty(Required = Required.AllowNull)] 
    public bool IsAlive { get; set; } 

    [JsonProperty(Required = Required.AllowNull)] 
    public string Description { get; set; } 

    [JsonProperty(Required = Required.AllowNull)] 
    public PidDTO Pid { get; set; } 
} 

public class BaseEntityDTO 
{ 
    [JsonProperty(Required = Required.AllowNull)] 
    public bool IsDeleted { get; set; } 

    [JsonProperty(Required = Required.AllowNull)] 
    public DateTime AddedDate { get; set; } 

    [JsonProperty(Required = Required.AllowNull)] 
    public DateTime UpdatedDate { get; set; } 
} 

這使您的派生類型繼續有選擇退出序列化。