2017-04-26 3 views
0

私はクラスContactを持っています。からXamarin.Formsに派生しました。JsonConvert.SerializeObjectを使ってサーバにデータを送信しようとしています。クラスをシリアライズする際に基底クラスレルムを除外します

しかし問題は、すべての基本クラスのプロパティRealmもJSONに変換していることです。私はレルムクラスを第三者クラスとしてコントロールしていません。

Realmクラス全体を私のモデルから無視するにはどうすればいいですか?

[JsonObject(MemberSerialization.OptIn)] 
public class Contact : RealmObject 
{ 
    [JsonProperty] 
    public string birthdate { set; get; } 

    [JsonProperty] 
    public string city { set; get; } 

    [JsonProperty] 
    [PrimaryKey] 
    public string contactId { set; get; } 

    [JsonProperty] 
    public string country { set; get; } 
} 

この方法JsonProperty属性を持つプロパティだけをシリアル化されます:あなたはオプトインすることができ、クラスにJsonObject属性を使用して、プロパティの直列化を変更することがあり

Contactモデル

public class Contact : RealmObject 
    { 
     public string birthdate { set; get; } 
     public string city { set; get; } 
     [PrimaryKey] 
     public string contactId { set; get; } 
     public string country { set; get; } 
} 

答えて

3

注:JsonPropertyの代わりにJsonObjectDataMemberの代わりにDataContractを使用することもできます。彼らはJson.NETと同じように動作します。シリアライズ時に

public class MyContractResolver : DefaultContractResolver 
{ 
    public new static readonly MyContractResolver Instance = new MyContractResolver(); 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 

     if (property.DeclaringType == typeof(RealmObject)) 
     { 
      property.ShouldSerialize = o => false; 
     } 

     return property; 
    } 
} 

するシリアライザに割り当てることを忘れないでください:カスタムContractResolver

を使用して

代替あなたが(もう少しコードを書く)カスタムContractResolverを使用して同じ結果を得ることができます

JsonConvert.SerializeObject(
     contact, 
     Formatting.Indented, 
     new JsonSerializerSettings { ContractResolver = MyContractResolver.Instance }); 

+0

あなたは各フィールドにタグを付けるのではなく、Contactクラスを単純に考えることができる 'DataContract'を使用する例がありますか – Hunt

+0

オプトインシリアル化を使用することはできません。ベースクラスにアクセスできない場合は、単一のプロパティを装飾する必要があります –

+0

@HuntカスタムContractResolver –

関連する問題