Closed efanhome closed 5 years ago
http://dubbo.io/Serialization+Issues-zh.htm 1.hessian 序列化不支持反序列化 java.util.EnumSet,dubbo协议默认使用 hessian 做序列化。
原生的hessian在4.0.3版修复了此问题,详细的可以移步这里看下。
dubbo内嵌的hessian版本是3.2.1-fixed-2
使用hessian协议+原生hessian反序列化可避免此问题,但会出现如下类似警告信息
警告: Hessian/Burlap: 'java.lang.Enum' is an unknown class in sun.misc.Launcher$AppClassLoader@27c170f0:
java.lang.RuntimeException: Class java.lang.Enum is not an enum
是的,我就是从这里拷过来测试的,改了一个地方消除了警告,可以运行单元测试。 另外hessian 4.0.3源码包中没有看到这段修改,比较奇怪
那是网友自己写的patch,他自己说可能某种程度上说不是好的解决方式
It's not a proper fix by any means, but it's good enough for me to make forward progress while I wait for a "real" fix from an actual developer...
hessian官方在版本4.0.3,接口Deserializer
加了3个方法
public Object[] createFields(int len)
Object createField(String name)
Object readObject(AbstractHessianInput in, Object []fields) throws IOException
由此改了一大堆方法,有兴趣你可以研究下咯 -_-||
@efanhome 我看了下hessian 4.0.3 是新增的UnsafeDeserializer来支持了EnumSet的反序列化。
如果不直接升级到4.0.x版本的话也可以修改下SerializerFactory,合入UnsafeDeserializer\UnsafeSerializer 这部分来支持
@wuwen5 谢谢告知,你的求知欲比我高许多,向你学习 :+1:
👍
使用dubbo协议,暴露的接口参数中含有EnumSet,消费端调用传入值后(EnumSet.of(e)),服务端收到的值为null,详细的异常信息: