Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException

简介: Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException

背景

前不久翎野君帮同事看一个问题,比较有启发性,特记录一下。一个dubbo rpc方法中,从请求对象中取出Set<Byte>变量进行循环操作,然后出现下面的问题。

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<Byte> byteSet = new HashSet<>();
        byteSet.add((byte) 11);
        byteSet.add((byte) 6);
        byte[] byteSetArray = serialize(byteSet);
        Set<Byte> dsByteSet = (Set<Byte>) deserialize(byteSetArray);
        // 会报类型转换错误
        for (Byte aByte : dsByteSet) {
            System.out.println(aByte);
        }
        Map<Byte, Byte> byteMap = new HashMap<>();
        byteMap.put((byte) 2, (byte) 3);
        byte[] byteMapArray = serialize(byteMap);
        Map<Byte, Byte> dsByteMap = (Map<Byte, Byte>) deserialize(byteMapArray);
        // 会报类型转换错误
        Byte value = dsByteMap.get(2);
        System.out.println(value);
    }
    public static byte[] serialize(Object obj) throws IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        Hessian2Output ho = new Hessian2Output(os);
        byte[] cc = null;
        try {
            if (obj == null) throw new NullPointerException();
            ho.writeObject(obj);
            ho.flushBuffer();
            cc = os.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ho.close();
        }
        return cc;
    }
    public static Object deserialize(byte[] by) {
        try {
            if (by == null) throw new NullPointerException();
            ByteArrayInputStream is = new ByteArrayInputStream(by);
            Hessian2Input hi = new Hessian2Input(is);
            return hi.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

过程

hessian2官方文档:http://hessian.caucho.com/doc/hessian-serialization.html

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类型进行读取

警示

在使用Hessian协议对Byte类型进行序列化操作时会发生类型转化的问题,故而Byte及相关集合类如Set<Byte>、List<Byte>、Map<Byte, Byte>等尽量避免使用。

 

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

原文链接:https://www.cnblogs.com/lingyejun/p/15586083.html

目录
相关文章
|
1月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
1月前
|
Java
java中的泛型类型擦除
java中的泛型类型擦除
13 2
|
1月前
|
存储 Java 数据库
java包装类的作用、基本类型和包装类型的区别
java包装类的作用、基本类型和包装类型的区别
31 0
java包装类的作用、基本类型和包装类型的区别
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第四十三题:编程用多态实现打印机.。分为黑白打印机和彩色打印机,不同类型的打印机打印效果不同。
【Java每日一题】——第四十三题:编程用多态实现打印机.。分为黑白打印机和彩色打印机,不同类型的打印机打印效果不同。
39 0
|
1月前
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
28 4
|
1月前
|
存储 Java fastjson
Java泛型-4(类型擦除后如何获取泛型参数)
Java泛型-4(类型擦除后如何获取泛型参数)
33 1
|
1月前
|
Shell
Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
【2月更文挑战第17天】Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
56 2
|
19小时前
|
Java 编译器
【Java探索之旅】解密Java中的类型转换与类型提升
【Java探索之旅】解密Java中的类型转换与类型提升
8 0
|
3天前
|
安全 Java 程序员
Java 泛型类型:变幻中的不变性
【4月更文挑战第21天】
4 1
Java 泛型类型:变幻中的不变性
|
4天前
|
XML SQL 前端开发
【Java】实体字段传参类型线上问题记录
【Java】实体字段传参类型线上问题记录
17 1