![](/img/trans.png)
[英]Jackson serialization and deserialization of a 3rd party class without writing a custom serializer and or deserializer
[英]Custom jackson deserializer for 3rd party library
我正在尝试为第三方库中的类编写自定义Jackson反序列化器。 我已经为一个基本类(持续时间)创建了一个,但现在我正在尝试为具有Duration实例的类(RetryPolicy)编写下一个类,我不太确定如何继续。 我想利用我的持续时间解串器,所以我不必重复它的逻辑。
这是一个代码示例:
RetryPolicy rp =
new RetryPolicy()
.withRetryInterval(Duration.seconds(2))
.withBackoff(Duration.seconds(2), Duration.minutes(30), 2)
.withMaxDuration(Duration.hours(1))
.withMaxRetries(100);
正如我所说,我已经有了一个用于Duration的反序列化器,如果我创建一个模块并将我的DurationDeserializer类添加到它然后将该模型注册到ObjectMapper,我似乎几乎能够反序列化以下JSON:
{
"retryInterval": "2 seconds",
"backoff": {
"retryInterval": "2 seconds",
"maxRetryInterval": "5 minutes",
"retryIntervalMultiplier": 2
},
"maxDuration": "30 minutes",
"maxRetries": 100
}
我得到的例外是:
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "backoff" (class net.jodah.lyra.retry.RetryPolicy), not marked as ignorable (5 known properties: , "maxRetries", "maxDuration", "maxRetryInterval", "retryInterval", "retryIntervalMultiplier"])
所以它实际上似乎能够自己填充所有的Duration和int字段(即使这个类使用的是构建器模式而没有build()方法。唯一有问题的是withBackoff(持续时间,持续时间, int)方法。
我不太确定从哪里开始。 我是否为RetryPolicy类编写自定义反序列化程序? 如果是这样,我如何避免解析所有JSON(例如,我只想将所有Duration变量委托给我已经创建的DurationDeserializer类)?
我应该注意(尽管可能很明显)我无法注释第三方库(Duration和RetryPolicy类),这就是我要采用自定义序列化方式的原因。
有更复杂的方法可以做到这一点,但最简单的方法是查看SerializerProvider
中的委托方法(请参阅defaultSerializeValue()
)和DeserializationContext
(请参阅findContextualValueDeserializer()
):这些对象将传递给您的自定义(反)序列化程序。 因此,您可以将处理委托给(de)为值类型注册的序列化程序。 这与您要处理默认方式的任何类型使用的方法相同(无论映射器配置了什么)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.