hessian 序列化 异常

      最近忙于业务迭代开发,没有太多时间思考。这两天,开发的时候遇到了一个hessian 序列化异常,拿出来记录一下分析的过程及解决方法。

      

      先上异常酷,

      

2016-06-01 10:59:37 New I/O server worker #1-1 WARN  [com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation:112] -  [DUBBO] Decode argument failed: com.apricotforest.casefolder.medical.search.vo.MedicalRecordSearchVo.tagId: expected integer at 0x24 [B
 ([B@1e919697), dubbo version: 2.5.3, current host: 192.168.10.23com.alibaba.com.caucho.hessian.io.HessianFieldException: com.apricotforest.casefolder.medical.search.vo.MedicalRecordSearchVo.tagId: expected integer at 0x24 [B ([B@1e919697)
	at com.alibaba.com.caucho.hessian.io.JavaDeserializer.logDeserializeError(JavaDeserializer.java:671)
	at com.alibaba.com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:400)
	at com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:233)
	at com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:157)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2067)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1592)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1576)
	at com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectInput.readObject(Hessian2ObjectInput.java:94)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:109)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:71)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:137)
	at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:126)
	at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:87)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:46)
	at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:134)
	at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:80)
	at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
	at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
	at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:349)
	at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:280)
	at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:200)
	at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
	at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:44)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.alibaba.com.caucho.hessian.io.HessianProtocolException: expected integer at 0x24 [B ([B@1e919697)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2720)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2691)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readInt(Hessian2Input.java:773)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readType(Hessian2Input.java:2296)
	at com.alibaba.com.caucho.hessian.io.BasicDeserializer.readObject(BasicDeserializer.java:251)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1696)
	at com.alibaba.com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:396)
	... 26 more

 

        看到这段异常,分分钟想到了dubbo序列化默认用的是hessian,而hessian处理复杂对象时爆出的异常,不太好理解,于是写出一个测试类模拟了一下hessian 序列化/反序列化

 

   

package com.apricotforest.casefolder.medical.utils;


import com.alibaba.com.caucho.hessian.io.HessianSerializerInput;
import com.alibaba.com.caucho.hessian.io.HessianSerializerOutput;
import com.apricotforest.casefolder.medical.search.vo.MedicalRecordSearchVo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * Created by  on 16/5/31.
 */
public class HessianSerializeUtil {


    /**
     * 纯hessian序列化
     *
     * @param object
     * @return
     * @throws Exception
     */

    public static byte[] serialize(Object object) throws Exception {
        if (null == object) {
            throw new NullPointerException();
        }
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        HessianSerializerOutput hessianOutput = new HessianSerializerOutput(os);
        hessianOutput.writeObject(object);
        return os.toByteArray();
    }

    /**
     * 纯hessian反序列化
     *
     * @param bytes
     * @return
     * @throws Exception
     */

    public static Object deserialize(byte[] bytes) throws Exception {
        if (bytes == null) {
            throw new NullPointerException();
        }
        ByteArrayInputStream is = new ByteArrayInputStream(bytes);
        HessianSerializerInput hessianInput = new HessianSerializerInput(is);
        Object object = hessianInput.readObject();
        return object;
    }
    public static void main(String[] args) throws Exception {

        byte[] bytes;
        // String[] arr = {"6eb90e77-f37-4daf-8665-fc56951f9a25",
        //         "aedf9088-899c-4200-940e-72215b38d258","6142DD32-485A-4393-B757-24B8DC043E99"};

        String[] arr = new String[]{"4e2a6912-f4b9-4e04-a999-982ef2bcc64f", "88f4fcc6-43ef-4ccb-8a1a-d50d59313d3a"};
        MedicalRecordSearchVo searchVo = new MedicalRecordSearchVo()
                .setKeyword("ddd").setUserId(2100000005).setTagId(arr);
        bytes = HessianSerializeUtil.serialize(searchVo);
        System.out.println("序列化后对象:" + bytes);
        System.out.println("反序列化后正常属性: " + ((MedicalRecordSearchVo) HessianSerializeUtil.deserialize(bytes)).getKeyword());
        System.out.println("反序列号后数组属性: " + ((MedicalRecordSearchVo) HessianSerializeUtil.deserialize(bytes)).getTagId()[0]);

    }
}

       本地序列化后,发现数据可以正常反序列化,深入异常,查看异常所对应的代码块,调用栈如下

 

    

        仔细查看服务调用方传过来的数据,发现类型不匹配导致,升级依赖客户端即可

       

        ps:dubbo 接口联调过程,需要在本地联调,但是本地环境和开发环境共用一个zk,所以使用dubbo 控制台,对开发环境接口降权或添加白名单策略

 

 

com.alibaba.com.caucho.hessian.io.HessianProtocolException解决办法 com.alibaba.com.caucho.hessian.io.HessianProtocolException: expected map/object at java.lang.String (Ljava/lang/String;Ljava/lang/String;) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.e... 阅读详情

相关推荐

List.of()的坑——不能够序列化

List.of()的坑——不能够序列化 场景:在dubbo接口中返回了空集合是使用了List.of() 方法创建了个空的集合,放入到响应数据中 报错信息如下: Exception in thread "main" com.alibaba.com.caucho.hessian.io.HessianFieldException: com.demo.SerializeTest$ResponseDto.data: java.util.CollSer:java.lang.reflect.InvocationTarge

qq_43039260的博客 2246

结合源码分析Seata的工作流程

之前已经写过关于Seata的几种模式的原理以及Seata的一个AT模式的demo 今天主要从这个demo出发,讲一下seata的工作流程 配置文件 seata的配置文件入口为registry.conf 查看源码ConfigurationFactory.java public final class ConfigurationFactory { private static final L...

weixin_45661382的博客 2201

AUTOSAR BswM配置实战:手把手教你用Vector Davinci Configurator搭建第一个模式管理规则

本文详细介绍了如何使用Vector Davinci Configurator工具配置AUTOSAR BswM模块,实现车身控制ECU的模式管理规则。通过实战案例,从环境准备、核心概念梳理到具体配置步骤,包括ModeRequestPort、ModeCondition、Logical Expression和Rules的构建,帮助工程师快速掌握BswM配置技巧,提升汽车电子软件开发效率。

weixin_28678831的博客 353

com.alibaba.com.caucho.hessian.io.HessianFieldException之异常

[com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation] - [DUBBO] Decode argument failed: com.xxxx.commons.bean.po.CommonParameter.endDate: java.sql.Date cannot be assigned from null, dubbo version: 2.5.3, current host: 127.0.0.1com.alibaba.com.ca..

wangxuejava的博客 9391

麦克风声源定位原理_声源定位—如何定位到噪声根源?

前言TPA(传递路径分析)专题系列已经开篇。其遵循方法论:源(Source)——路径(Path)——响应(Receiver)有人说TPA好,它可以识别出路径处甚至源的载荷特征,可以量化各个路径的贡献量。有人说声源定位好,不管东西南北中,“源”自其中。但是,声源定位识别出来色彩丰富的一个结果,这结果被您拿来应付工作了,还是真正帮您解决了问题?声源定位定位到了噪声的根源了么?对于一些声源现,...

weixin_39943678的博客 3974

SIMULIA-Simpack 2022x新功能介绍

增加库伦摩擦类型力元95 Coulomb Friction增加了3种新的摩擦方向类型用于模拟平面、圆柱和球面摩擦。针对平移和旋转摩擦改进了滑动到粘着过渡阶段的检测,增加一个参数定义两种不同的滑移-粘滞过渡模式,即“Unloaded stick stiffness”和“Preload stick with last slip”。新增加124'Applied Load’力元允许用户将力或扭矩作为恒定值或通过激励元素施加到To Marker点上。该力元建模操作方便,效率高。支持线性柔性体装配。

crystalzhan的博客 1047

debbo最终打印结果显示_dubbo服务provider方打印警告日志,getDeserializer - Hessian/Burla 'xxx' is an unknown class...

2018-09-12 16:16:44 WARN [New I/O worker #1] SerializerFactory.java:652 getDeserializer - Hessian/Burlap: 'com.xxx.xxxBolt$1' is an unknown class in sun.misc.Launcher$AppClassLoader@a2c6f70今天下午4点过商品组同...

weixin_39927993的博客 613

UE4-(反射)场景采集之场景采集2D

一、场景采集分为两种:场景采集2D、场景采集立方体 场景采集2D:采集2D图片模式。 操作: 1.选择场景采集2D,是一个摄像机的物体,摆放到场景中。 2.在文件夹空白处创建纹理,一定要注意创建纹理的格式, 纹理分为立方体渲染目标和渲染目标,此处我们使用的是2D模式,所以选择渲染目标(Texture Render Target2D)。创建后重命名为RenderTextue2D。 3.选择场景中刚拖入的 SceneCapture2D 摄像机在细节面板的Scene Capture 将..

Stone的博客 4601

hessian BigDecimal反序列化异常

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33836874的博客 680

海康工业相机BayerRG8转BGR8实战:手把手教你用OpenCV实现高效图像转换

本文详细解析了海康工业相机BayerRG8格式到BGR8格式的高效转换实战。针对工业视觉项目中高帧率、大分辨率场景下的性能瓶颈,文章对比了海康SDK原生方案与OpenCV多种转换方法的优劣,并提供了从基础实现到高级优化(如多线程流水线、内存管理、SIMD指令集应用)的完整代码示例与性能调优策略,帮助开发者构建稳定、高效的图像处理系统。

weixin_29237635的博客 524

避坑指南:SAP CO模块维护成本控制范围的5个常见错误及解决方法

本文深入剖析了SAP CO模块中维护成本控制范围时最易犯的5个常见错误,包括货币参数配置不当、标准层次结构缺失、财政年度变式不一致、功能激活遗漏及集成参数设置错误。重点针对事务码OKKP的配置,提供了详细的排查步骤与实战解决方案,帮助顾问有效规避陷阱,确保成本核算体系稳定运行。

stone的博客 234

Hessian2ObjectInput.readObject : hessian 反序列化空指针异常

java.lang.NullPointerException at sun.reflect.GeneratedConstructorAccessor329.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorI...

随风 3486

【002】C++ 语言核心:关键字深度解析与分类指南

auto:自动类型推导bool:布尔类型break:跳出循环或switch语句case:switch语句分支char:字符类型class:定义类const:常量continue:结束当前循环,开始下一次循环default:switch语句默认分支delete:删除对象do:do-while循环double:双精度浮点数类型else:if语句的否定分支enum:枚举类型explicit:显式构造函数export:导出符号extern:声明外部变量或函数。

Lion_Long的博客 1250

JDK 17下Dubbo 3.3.0序列化异常?Hessian2兼容性解决方案

你是否在JDK 11+环境下遇到Dubbo服务调用抛出`HessianProtocolException`?本文通过3个实测案例,详解序列化失败根源与3种解决方案,5分钟内解决兼容性问题。读完你将获得: - 快速定位Hessian2与JDK高版本冲突的方法 - 3种解决方案的实施步骤与代码示例 - 基于Dubbo官方 demo 的最佳实践指南 ## 问题定位:为什么JDK升级后服务调用失败? ...

gitblog_00777的博客 593

【CAD二次开发】炸开所有的嵌套块

代码】【CAD二次开发】炸开所有的嵌套块。

1515

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Dubbo Hessian2序列化问题

Dubbo Hessian2序列化问题

qq_43667968的博客 1129

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Java】已解决:com.alibaba.com.caucho.hessian.io.HessianProtocolException异常

Hessian是一种轻量级的RPC框架,使用二进制协议进行远程调用,广泛应用于分布式系统中。已解决:com.alibaba.com.caucho.hessian.io.HessianProtocolException异常。为了解决该报错问题,我们需要确保客户端和服务器使用的User类完全一致,并且Hessian库版本兼容。通过上述代码,我们确保客户端和服务器的User类一致,并且使用兼容的Hessian库版本,从而避免。场景:在一个分布式系统中,客户端通过Hessian调用远程服务获取用户信息。

屿小夏.的知识博客 1962

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用hessian序列化器反序列化Short类型报类型转换异常

追踪了一下发现反序列化之前还是Short类型,消费者一反序列化之后就变成Integer类型,就算你用Integer变量去接受也没用,动态代理的返回值会跑到接口的方法里去和返回值做校验(我估计是这样,没跟源码)今天在写rpc框架的时候用了hessian来序列化,有一个接口方法返回short类型,被动态代理之后报错。省流: Hessian反序列化的时候会把Byte/Short 变成 Integer。

weixin_45957747的博客 259

ImmutableList hessian2序列化失败问题分析

Java中的不可变集合(guava的 ImmutableList、ImmutableSet等,Java9引入的ImmutableCollections相关类型)不能作为POJO参数进行序列化,但是可以直接作为对象进行序列化;float 反序列化后精度丢失,double 没问题;keySet()返回的Set未实现Serializable,Hessian反序列化结果为ArrayList;

诗酒年华 3189

Hessian 的字段序列化小记

  Hessian 的字段序列化小记   一背景: 今天线上碰到一个问题,在通过hessian的反序列化的时候失败了。 简单查看了下原因,是因为服务端和客户端依赖的bean包版本不一致导致的。   二 具体分析: Client --- > commons-entity  Sever  ---  > commons-entity    做了依赖倒置处理,服务...

知行天下 700

记录使用dubbo,遇到的hessian序列化告警

WARN com.alibaba.com.caucho.hessian.io.SerializerFactory -Hessian/Burlap: 'com.qxz.third.model.dtk.DtkSuperCategoryResponse$SubCategory' is an unknown class in sun.misc.Launcher$AppClassLoader@681a9515: java.lang.ClassNotFoundException:com.qxz.third.mod

默默前行,勿喜、勿悲、一切随缘! 5446

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

背景 前不久翎野君帮同事看一个问题,比较有启发性,特记录一下。一个dubbo rpc方法中,从请求对象中取出Set<Byte>变量进行循环操作,然后出现下面的问题。 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte 乍一看还有些费解,好好的代码,看上去那么的乖巧可爱,怎...

翎野君的博客 675

Dubbo/Hession2序列化Immutable类型的集合异常问题

根据堆栈信息可见,dubbo使用默认的hession2进行序列化时出现了异常,异常堆栈根原因为:null array位于java.util.CollSer#readResolve方法中,即在序列化集合时,集合数组为空。向上追溯jdk.internal.reflect.NativeMethodAccessorImpl#invoke,中可以看到传入的array确实为null,

weixin_44345870的博客 736

Hessian和Java反序列化问题小结

转载地址:http://hittyt.iteye.com/blog/1691772#bc2368273   Hessian反序列化问题 众所周知,Hessian框架提供的序列化方式,在性能上要优于Java自己的序列化方式。他将对象序列化,生成的字节数组的数量要相对于Java自带的序列化方式要更简洁。 目前公司的一个项目中,有RPC调用的需要,这里我们使用了公司自己的开源

xubo_zhang的专栏 1万+

hession 源码解析 自定义序列化器

背景 最近在处理一个hessian的反序列化问题时,因为服务端使用了pojo bean中多了一个enum属性,导致客户端在反序列化时疯狂的在打印日志。警告说找不到对应的enum class,因为项目中本身是设置了log4j的根输出为一个文件。 比较奇怪的是,hessian对应的日志输出全都打印到了控制台(虽然我们对console进行了重定向输出),导致对应的文件达到几百MB。无...

xiaoliuliu2050的专栏 1021
上一篇: elasticSearch 使用之插件篇
下一篇: springboot 结合 Quartz 开发中的一些坑
excel_bat
博客等级 码龄16年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值