2016-03-27 2 views
3

私のプロジェクトでjsonの文字列を作るために私はJsonConvertを使用していますが、何か変わったことが起こっています。エンティティは値を持ちますが、なんらかの理由でプロセス中に失われます。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; } 
} 

しかし

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

しかし、Json.NETはDataContractAttributeInherited = false属性を尊重し、すべての派生型を解釈しません:DataContractAttribute sets AttributeUsageAttribute.Inherited = falseので理論的には、ベースクラスに適用DataContractAttributeの存在がないは、あなたの派生型に影響を与える必要があります説明されたように、オプトインシリアライゼーションを有するものとしてデータコントラクト型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; } 
} 

これは、あなたの派生型がオプトアウトのシリアライズを持ち続けることができます。