【问题标题】:C# Json serialization backing field references property instead of the other way roundC# Json 序列化支持字段引用属性而不是相反
【发布时间】:2016-04-13 09:04:42
【问题描述】:

我使用 NewtonSoft.Json 最新版本,需要 serdes 第三方对象。我需要序列化字段。这是我使用的 JsonSerializerSettings:

JsonSerializerSettings settings_ = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Include,
    DefaultValueHandling = DefaultValueHandling.Include,
    PreserveReferencesHandling = PreserveReferencesHandling.All,
    ObjectCreationHandling = ObjectCreationHandling.Replace,
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
    ContractResolver = new DynamicContractResolver(),
};
public class DynamicContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization)
    {
        IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
        properties = properties.Where(p => p.PropertyName != "MonitoringInstance" && p.PropertyName != "SessionInstance").ToList();
        var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Select(f => CreateProperty(f, memberSerialization));
        return properties.Union(fields, new EqualityComparer()).ToList();
    }
}

不幸的是,无论我如何尝试,支持字段都引用了属性。有没有办法扭转它?任何见解都值得赞赏。

【问题讨论】:

    标签: c# json serialization json.net field


    【解决方案1】:

    DataContractAttribute 简单地装饰你的类,用DataMemberAttribute 装饰字段要容易得多。除非你真的想自己实现合约解析器,否则这就是我们一直在用 JSON 做的事情。

    【讨论】:

    • 是第三方对象
    • 你怎么知道你的第三方对象首先是可序列化的?根据它们的大小,将所述对象复制到可序列化的 DTO 中可能是有意义的。
    • 它有 [Serializable] 属性。它很大。所以,DTO 适得其反。
    • 对应的属性被正确序列化,但支持字段为空。
    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多