Hessian序列化过程中Map的问题

  1. 云栖社区>
  2. 博客列表>
  3. 正文

Hessian序列化过程中Map的问题

晴天哥 2018-11-28 17:56:35 浏览16537 评论1

摘要: 开篇  近期线上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

【云栖快讯】阿里云栖开发者沙龙(Java技术专场)火热来袭!快来报名参与吧!  详情请点击

网友评论

1F
gydtep

阿里云服务器2折起,可免费领取1888元代金券,官方活动网址:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=2a7uv47d 新用户和老用户都可以用。