序列化不支持OptionalJava Encode error. msg=java.util.Optional
xesrikrc1#
jetcache要求value可以被序列化器序列化,默认的序列化器是java内置的序列化,java.util.Optional没有实现Serializable,这个结果是意料中的。
要解决这个问题你可以定制自己的序列化器来处理。
在jetcache层面统一解决,方案会有点坑。写个if else是可以检查返回值是否Optional类型,然后做特别的处理,但是返回值里面的字段如果是Optional呢?
nfs0ujit2#
感觉支持Optional还是很有必要的,jdk8后Optional的使用会逐步加重。
ffx8fchx3#
但是怎么实现呢?
jfewjypa4#
我也想知道,目前就是不支持Optional ,卡住了,如果找不到解决方案,就得另寻它法了。上面提到的定制序列化器有参考的代码么
kqhtkvqz5#
2.6版本,直接在Spring Context中提供一个EncoderParser示例就可以了。然后yml里面可以指定默认的valueEncoder和valueDecoder。2.6之前的版本, 提供一个自己的SpringConfigProvider示例,覆盖parseValueEncoder和parseValueDecoder方法。然后yml里面可以指定默认的valueEncoder和valueDecoder。
参考源代码里面的JavaValueEncoder/JavaValueDecoder
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
pinkon5k7#
想用Jackson实现序列化,提供EncoderParser示例,实现了apply 和doapply方法,但是报no decoder for identity number:0看了源码,执行了abstractValyeDecoder.apply方法时会根据buffer获取个headerNumber,根据headerNumber获取Decoder,获取不到(因为registerDecoderBuilder里面就写死了注册Java和kryo两种方式)
vsikbqxv8#
你可以调用DecoderMap的register方法自己注册啊
k2fxgqgv9#
你甚至可以不继承AbstractValueDecoder
9条答案
按热度按时间xesrikrc1#
jetcache要求value可以被序列化器序列化,默认的序列化器是java内置的序列化,java.util.Optional没有实现Serializable,这个结果是意料中的。
要解决这个问题你可以定制自己的序列化器来处理。
在jetcache层面统一解决,方案会有点坑。写个if else是可以检查返回值是否Optional类型,然后做特别的处理,但是返回值里面的字段如果是Optional呢?
nfs0ujit2#
感觉支持Optional还是很有必要的,jdk8后Optional的使用会逐步加重。
ffx8fchx3#
感觉支持Optional还是很有必要的,jdk8后Optional的使用会逐步加重。
但是怎么实现呢?
jfewjypa4#
我也想知道,目前就是不支持Optional ,卡住了,如果找不到解决方案,就得另寻它法了。
上面提到的定制序列化器有参考的代码么
kqhtkvqz5#
2.6版本,直接在Spring Context中提供一个EncoderParser示例就可以了。然后yml里面可以指定默认的valueEncoder和valueDecoder。
2.6之前的版本, 提供一个自己的SpringConfigProvider示例,覆盖parseValueEncoder和parseValueDecoder方法。然后yml里面可以指定默认的valueEncoder和valueDecoder。
参考源代码里面的JavaValueEncoder/JavaValueDecoder
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
pinkon5k7#
想用Jackson实现序列化,提供EncoderParser示例,实现了apply 和doapply方法,但是报no decoder for identity number:0
看了源码,执行了abstractValyeDecoder.apply方法时会根据buffer获取个headerNumber,根据headerNumber获取Decoder,获取不到(因为registerDecoderBuilder里面就写死了注册Java和kryo两种方式)
vsikbqxv8#
你可以调用DecoderMap的register方法自己注册啊
k2fxgqgv9#
你甚至可以不继承AbstractValueDecoder