Hessian序列化过程中Map的问题

开篇

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

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

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


背景

Hessian序列化过程中Map的问题_第1张图片
dubbo调用图
TfScoreParam tfScoreParam = new TfScoreParam(config.fetchOperations);

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

说明:

    1. dubbo的consumer端对TfScoreParam对象进行序列化。
    1. 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端报上述错误。
    1. dubbo的provider端找不到Config类。


问题复现

复现步骤:

  • 1.工程A负责序列化

  • 2.工程B负责反序列化

    1. 工程A和B是两个独立的工程,且工程B不包含工程A的类。



IDEA创建的工程A

public class DemoA {
    public Map 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 map = (Map)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


招聘信息

【招贤纳士】

欢迎热爱技术、热爱生活的你和我成为同事,和贝贝共同成长。

贝贝集团诚招算法、大数据、BI、Java、PHP、android、iOS、测试、运维、DBA等人才,有意可投递[email protected]

贝贝集团创建于2011年,旗下拥有贝贝网、贝店、贝贷等平台,致力于成为全球领先的家庭消费平台。

贝贝创始团队来自阿里巴巴,先后获得IDG资本、高榕资本、今日资本、新天域资本、北极光等数亿美金的风险投资。

公司地址:杭州市江干区普盛巷9号东谷创业园(上下班有多趟班车)

你可能感兴趣的:(Hessian序列化过程中Map的问题)