背景
前不久翎野君帮同事看一个问题,比较有启发性,特记录一下。一个dubbo rpc方法中,从请求对象中取出Set
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte
乍一看还有些费解,好好的代码,看上去那么的乖巧可爱,怎么会突然冒出来这个问题,带着怀疑的态度自己本地编写了Test方法试验了一下,发现也没有问题。然后就把目光放在dubbo传输框架上面了,查阅了一些资料,发现dubbo默认的hessian2序列化协议不支持Byte类型。
问题复现
package com.lingyejun.test;
import com.alibaba.com.caucho.hessian.io.Hessian2Input;
import com.alibaba.com.caucho.hessian.io.Hessian2Output;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class HessianTest {@Test
public void test() throws IOException {
Byte basicByte = 88;
byte[] basicByteArray = serialize(basicByte);
// 序列化后得到的是Integer类型的变量
Object obj = deserialize(basicByteArray);
// 会报类型转换错误
Byte desB = (Byte) obj;
Set
过程
hessian2官方文档:Hessian 2.0 Serialization Protocol
Hessian 的对象序列化机制有 8 种原始类型:
原始二进制数据
boolean
64-bit date(64 位毫秒值的日期)
64-bit double
32-bit int
64-bit long
null
UTF-8 编码的 string
我们发现基础类型中并不支持Byte类型,让我们在通过源码验证一下。
在序列化时将Byte、Shor、Integer统一按照int类型进行写流。
在反序列化的过程中将byte int 按照Integer类型进行读取
警示
【Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException】在使用Hessian协议对Byte类型进行序列化操作时会发生类型转化的问题,故而Byte及相关集合类如Set
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
推荐阅读
- Dubbo|【Dubbo | Zookeeper】一篇文章入门Dubbo+Zookeeper
- SpringBoot整合RPC框架Dubbo
- Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)
- Spring|Spring Cloud Alibaba(三)(使用 Nacos config 实现统一配置管理)
- Spring|Spring Cloud Alibaba(二)(注解实现 Dubbo 服务调用失败时的本地伪装)
- java框架|org.apache.curator.CuratorConnectionLossException: KeeperErrorCode = ConnectLoss
- Dubbo之RpcContext原理
- Java|dubbo @EnableAsync @Configuration
- dubbo中的ExtensionLoader详解