Hessian序列化过程中Map的问题

简介: 开篇  近期线上dubbo不停的报Hessian反序列化的警告日志,虽然不影响正常使用但作为有追求的程序员还是再一次尝试解决下,之所以说再一次是因为前一次尝试解决,但是没解决成功。  错误信息如下,结论是在consumer端序列化了object.map对象,在provider端解析不到object这个类,有兴趣可以继续下面的分析。

开篇

 近期线上dubbo不停的报Hessian反序列化的警告日志,虽然不影响正常使用但作为有追求的程序员还是再一次尝试解决下,之所以说再一次是因为前一次尝试解决,但是没解决成功。

 错误信息如下,结论是在consumer端序列化了object.map对象,在provider端解析不到object这个类,有兴趣可以继续下面的分析。

WARNING: Hessian/Burlap: 'com.model.Config$1' is an unknown class in WebappClassLoader


背景

dubbo调用图

TfScoreParam tfScoreParam = new TfScoreParam(config.fetchOperations);

public class Config {
    public Map<String, Integer> fetchOperations = new HashMap<String, Integer>() {
        {
            put("CTCVR", 1);
        }
    };
}

说明:

  • 1.dubbo的consumer端对TfScoreParam对象进行序列化。
  • 2.TfScoreParam的传入对象是config.fetchOperations,注意config类只在consumer端才有。


Nov 28, 2018 5:01:07 PM com.alibaba.com.caucho.hessian.io.SerializerFactory getDeserializer
WARNING: Hessian/Burlap: 'com.model.Config$1' is an unknown class in WebappClassLoader
  context: 
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@6576fe71

说明:

  • 1.dubbo的provider端报上述错误。
  • 2.dubbo的provider端找不到Config类。


问题复现

复现步骤:

  • 1.工程A负责序列化
  • 2.工程B负责反序列化
  • 3.工程A和B是两个独立的工程,且工程B不包含工程A的类。



IDEA创建的工程A

public class DemoA {
    public Map<String, Integer> map = new HashedMap() {
        {
            put("demo",12);
        }
    };
}


public class Demo {
    public static void main(String[] args) throws Exception {
        DemoA demoA = new DemoA();
        FileOutputStream fos = new FileOutputStream(new File("F:\\hessian"));
        HessianOutput ho = new HessianOutput(fos);
        ho.writeObject(demoA.map);
        ho.flush();
        ho.close();
    }
}



IDEA创建的工程B

public class dd {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream(new File("F:\\hessian"));
        HessianInput hi = new HessianInput(fis);
        Map<String, Integer> map = (Map<String, Integer>)hi.readObject();

        System.out.println(JSON.toJSONString(map));
    }
}



复现错误信息

十一月 28, 2018 5:26:11 下午 com.caucho.hessian.io.SerializerFactory getDeserializer
警告: Hessian/Burlap: 'com.pro.DemoA$1' is an unknown class in sun.misc.Launcher$AppClassLoader@e6ea0c6:
java.lang.ClassNotFoundException: com.pro.DemoA$1
{"demo":12}


结论(猜测)

  • 1.猜测Hessian的序列化和反序列化过程中对于Map这种引用类型会带上所属的对象信息。


参考

Hessian/Burlap: is an unknown class in WebappClassLoader

目录
相关文章
|
4月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
|
4月前
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
113 1
|
安全 测试技术 Nacos
Nacos Jraft Hessian反序列化远程代码执行漏洞
Nacos Jraft Hessian反序列化远程代码执行漏洞
1792 1
|
Dubbo Java 应用服务中间件
再谈序列化之rpc调用失败和jackson序列化时不允许Map中的key为null
再谈序列化之rpc调用失败和jackson序列化时不允许Map中的key为null
239 0
|
存储 分布式计算 JavaScript
Fury系列(四):一个比Kryo/Hessian快30~40倍的类型前后兼容序列化器
问题背景类型前后兼容是复杂业务场景序列化的常见需求。在快速迭代的业务场景当中,读写端经常发生对象字段发生变更:在线应用场景:线上SOFA/HSF应用提供服务给多个调用方,服务的滚动升级以及各个调用方独立更新都可能导致对象类型不一致的情况;在线服务场景:在线服务框架常驻不更改对象类型,但调用方业务逻辑变动独立更新导致对象字段跟服务端不一致;对象持久化场景:对象数据序列化后持久化写入存储(如Spark
1612 2
Fury系列(四):一个比Kryo/Hessian快30~40倍的类型前后兼容序列化器
|
Dubbo 算法 安全
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
|
SQL 存储 Java
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
|
机器学习/深度学习 JSON 网络协议
结构体 map 切片序列化|学习笔记
快速学习结构体 map 切片序列化
|
JSON Java 数据格式
Gson序列化输出Ignore策略 -- Map篇
前面介绍了几种gson在序列化时,忽略某些字段数输出的方式,然而当时的实例中,需要序列化的对象都是Java bean对象,如果我们需要序列化的是Map对象,又可以怎么处理呢? 接下来我们通过实际的case,来演示如何实现Map忽略指定key的功能
599 0
下一篇
DataWorks