【问题标题】:JsonConvert.SerializeObject - Custom ContracteResolver not calling CreateProperty for multiple callsJsonConvert.SerializeObject - 自定义 ContracteResolver 不为多次调用调用 CreateProperty
【发布时间】:2019-02-26 01:41:21
【问题描述】:

我有一个自定义 ContracteResolver,但我得到了不可预测的结果。

使用调试器,我看到当我序列化解析器的 CreateProperty 方法时,每个属性都会被调用。但是,如果我进行 2 次背靠背调用,则不会在第二次调用时调用 CreateProperty 方法。我在 CreateProperty 中的断点在第二遍时从未命中,而是在第一遍中命中。

这是我的设置:

IContractResolver contractResolver = new ShouldSerializeContractResolver(fieldsToSerialize, this.Data);
var settings = new JsonSerializerSettings()
{
ContractResolver = contractResolver
};

_payload = JsonConvert.SerializeObject(this.Data, Formatting.None, settings);

两个调用的源值 (this.Data) 不同。两个调用的结果(_payload)也不同。我认为没有任何内容被缓存。

我看到了一个由自定义 ContentNegotiator 引起的类似问题,但我没有使用它。

为什么 CreateProperty 不会在第二遍时被命中?

【问题讨论】:

  • ShouldSerializeContractResolver 继承自什么?是DefaultContractResolver 还是CamelCasePropertyNamesContractResolver
  • 因为如果您从 CamelCasePropertyNamesContractResolver 继承,它会在应用程序域期间全局缓存所有合同信息。详情请见Json.Net: Html Helper Method not regenerating

标签: json.net jsonconvert


【解决方案1】:

DefaultContractResolver 类缓存每种对象类型的协定以获得最佳性能。您可以在 source code 中看到这一点,它在构造函数中创建缓存:

public DefaultContractResolver()
{
   ...
    _contractCache = new ThreadSafeStore<Type, JsonContract>(CreateContract);
}

以及在为每种类型解析合同时如何使用它:

public virtual JsonContract ResolveContract(Type type)
{
    ValidationUtils.ArgumentNotNull(type, nameof(type));

    return _contractCache.Get(type);
}

如果:

  1. 您的自定义解析器派生自DefaultContractResolver,并且
  2. 您每次都使用相同的解析器实例,并且
  3. 您的数据对象属于同一类型(即使它们具有不同的数据)

那么很正常,预计CreateProperty只会在第一次序列化时被调用。

【讨论】:

  • 几乎是答案。我没有使用相同的解析器实例,但我从缓存在静态变量中的 CamelCasePropertyNamesContractResolver 继承。如果我从 DefaultContractResolver 继承它可以工作,但我丢失了我的 CamelCase。如何使用两个解析器?我正在根据数据添加和删除字段。
  • 没有办法同时使用两个解析器。如果您只需要骆驼大小写行为并且您使用的是 Json.Net 9.0 或更高版本,则可以将默认解析器(或您的自定义衍生工具)上的 NamingStrategy 属性设置为 CamelCaseNamingStrategy 获取骆驼大小写命名。跨度>
  • 我有同样的问题,但它根本没有发现它。
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2020-11-08
相关资源
最近更新 更多