在序列化类时排除基类领域

时间:2017-04-26 11:34:42

标签: c# xamarin realm

当我尝试使用Contact将数据序列化到服务器时,我有一个Realm来自Xamarin.Forms的{​​{1}}类。

但问题是,它正在将所有基类属性JsonConvert.SerializeObject转换为JSON。作为第三方类,我对领域类没有任何控制权。

所以如何忽略模型中的整个Realm类。

Realm型号

Contact

1 个答案:

答案 0 :(得分:3)

您可以在课程中使用JsonObject属性,并将属性的序列化更改为选择加入:

[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属性的属性才会被序列化。

注意:您也可以使用DataContract代替JsonObjectDataMember代替JsonProperty。它们与Json.NET以相同的方式工作。

使用自定义ContractResolver

的备选方案

使用自定义ContractResolver(编写更多代码)可以获得相同的结果:

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;
    }
}

请记住在序列化时将其分配给序列化程序:

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