问题
定义了一个接口,返回值为Map<String, Byte>
,consumer收到结果后,使用Byte value = map.get(key)
获取结果,抛出了如下类型转换异常:
如下:
1 |
|
当时很奇怪,为什么返回值已经是Map<String, Byte>
了,还会抛类型转换异常呢。
分析
首先想到的是通过debug确认返回的类型是否是Byte,设置断点后发现返回的Map的value的类型并不是Byte
而是Integer
,那么为什么会是Integer
呢?
这里猜测这里很可能是dubbo序列化导致的,dubbo默认使用Hessaian2作为序列化协议,所以去看了下Hessian2的序列化实现,果不其然,byte会被反序列化成Integer
代码在Hessian2Input
的readObject
方法:
1 |
|
为了更好说明Hessian2序列化和反序列的问题,可以使用其序列化和反序列化
测试代码如下:
1 |
|
运行该test,再一次抛出了Integer转Byte失败的异常,这就证明了我们的猜测,Hessian2序列化确实存在这个问题。
那么问题清晰了,解决就很自然了,要么换一种序列化协议,要么用Object接受Byte,然后把object强转成Byte(证实可行)。