美文网首页
Hessian序列化过程中Map的问题

Hessian序列化过程中Map的问题

作者: 晴天哥_王志 | 来源:发表于2020-09-15 09:35 被阅读0次

    开篇

     近期线上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对象进行序列化。
      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<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

    相关文章

      网友评论

          本文标题:Hessian序列化过程中Map的问题

          本文链接:https://www.haomeiwen.com/subject/semxyktx.html