首页 > 解决方案 > System.Json.Net - 反序列化任务失败(没有无参数构造函数)

问题描述

我遇到了一个问题,我无法使用System.Text.Json(.Net 5)将字符串反序列化为任务。

JsonSerializer.Deserialize<Task<TItem>>(serializedItem)

背景

我有一个本地化缓存并将从数据库检索到的项目存储在其中。

我无法将实际项目存储在缓存中,因为对对象的任何后续操作都会导致缓存项目被操作,从而影响所有进一步的使用。因此,我存储了对象的序列化副本。

关于性能...

我正在使用异步/等待模式来调用数据库(整个应用程序是异步的)。

我读了一篇文章(可能是一段视频),其中 Stephen Toub 描述了缓存任务的性能优势。这篇 SO 文章何时缓存任务?进入细节。无论如何,我想我会尝试在我的本地缓存“层”中使用以下内容来利用这一点(它可以完美地工作而无需序列化):

  1. 如果 Task 在我的缓存中,等待它并返回结果。
  2. 否则,在不等待的情况下调用 DB 方法并将结果任务添加到缓存中

当我添加序列化时,任务的反序列化:

Task<TItem>? cachedItem = JsonSerializer.Deserialize<Task<TItem>>(serializedItem);

结果是

不支持对没有无参数构造函数、单一参数化构造函数或带有“JsonConstructorAttribute”注释的参数化构造函数的类型进行反序列化。

标签: cachingasync-awaitjsonserializersystem.text.json

解决方案


这里的答案比较直接——序列化Task结果里面的数据,而不是任务本身。

如果您不使用 memcached 之类的东西,而是使用简单Dictionary的进程内对象缓存之类的东西,那么序列化和反序列化似乎是克隆对象的一种相当繁重的方法。


推荐阅读