【问题标题】:exclude base class realm in serializing the class在序列化类时排除基类领域
【发布时间】:2017-04-26 11:34:41
【问题描述】:

我有一个类Contact,它派生自Xamarin.Forms 中的Realm,现在我尝试使用JsonConvert.SerializeObject 对其进行序列化以将数据发送到服务器。

但问题是,它也将其所有基类属性Realm 转换为 JSON。作为第三方类,我无法控制领域类。

那么我如何从我的模型中忽略整个 Realm 类。

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

【问题讨论】:

    标签: c# xamarin realm


    【解决方案1】:

    您可以在您的类上使用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 });
    

    【讨论】:

    • 你有什么例子可以使用DataContract,我可以简单地考虑一下联系人类而不是标记每个字段
    • 选择加入序列化你不能。如果无法访问基类,则必须装饰单个属性
    • @Hunt 添加了使用自定义 ContractResolver 的替代方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多