jetcache 序列化不支持Optional Java Encode error. msg=java.util.Optional

u4dcyp6a  于 2022-11-06  发布在  Java
关注(0)|答案(9)|浏览(315)

序列化不支持Optional
Java Encode error. msg=java.util.Optional

xesrikrc

xesrikrc1#

jetcache要求value可以被序列化器序列化,默认的序列化器是java内置的序列化,java.util.Optional没有实现Serializable,这个结果是意料中的。

要解决这个问题你可以定制自己的序列化器来处理。

在jetcache层面统一解决,方案会有点坑。写个if else是可以检查返回值是否Optional类型,然后做特别的处理,但是返回值里面的字段如果是Optional呢?

nfs0ujit

nfs0ujit2#

感觉支持Optional还是很有必要的,jdk8后Optional的使用会逐步加重。

ffx8fchx

ffx8fchx3#

感觉支持Optional还是很有必要的,jdk8后Optional的使用会逐步加重。

但是怎么实现呢?

jfewjypa

jfewjypa4#

我也想知道,目前就是不支持Optional ,卡住了,如果找不到解决方案,就得另寻它法了。
上面提到的定制序列化器有参考的代码么

kqhtkvqz

kqhtkvqz5#

2.6版本,直接在Spring Context中提供一个EncoderParser示例就可以了。然后yml里面可以指定默认的valueEncoder和valueDecoder。
2.6之前的版本, 提供一个自己的SpringConfigProvider示例,覆盖parseValueEncoder和parseValueDecoder方法。然后yml里面可以指定默认的valueEncoder和valueDecoder。

参考源代码里面的JavaValueEncoder/JavaValueDecoder

de90aj5v

de90aj5v6#

自定制序列化器的建议:
encode的时候检查一下返回值,如果是Optional,拆开,然后序列化,序列化之前要先写入一个标识,表明这个数据本来是Optional,decode的时候要先读这个标识。
如果返回值里面的字段还有Optional,那就不管了,也管不了。

可以参考这里: https://stackoverflow.com/questions/24547673/why-java-util-optional-is-not-serializable-how-to-serialize-the-object-with-suc

pinkon5k

pinkon5k7#

想用Jackson实现序列化,提供EncoderParser示例,实现了apply 和doapply方法,但是报no decoder for identity number:0
看了源码,执行了abstractValyeDecoder.apply方法时会根据buffer获取个headerNumber,根据headerNumber获取Decoder,获取不到(因为registerDecoderBuilder里面就写死了注册Java和kryo两种方式)

vsikbqxv

vsikbqxv8#

你可以调用DecoderMap的register方法自己注册啊

k2fxgqgv

k2fxgqgv9#

你甚至可以不继承AbstractValueDecoder

相关问题