文档章节

java两种序列化(hessian与java自带)性能实验分析报告

雨打芭蕉
 雨打芭蕉
发布于 2015/02/13 14:39
字数 1052
阅读 162
收藏 1
点赞 0
评论 0

序列化的5w2h分析

what:序列化是一种将java对象流化的机制

how:将一个实现了Serializable接口的对象的状态写入byte[],传输到另外一个地方,将其读出进行反序列化得对象(含状态)。状态就是类中的属性是含有值的。

why:方便对象在网络间进行传播,并且可以随时把对象持久化到数据库、文件等系统里

when:对象需要远程过程调用,缓存到文件或DB中(hessian,rmi,ejb)

where:发送接口处,写入文件的入口处

who:发送端序列化,接收端反序列化

how much:序列化本身是昂贵的,但软件工程本身是复杂,在解藕与性能之间架构师要做一个判断。

实验环境

?
1
SerializeException 可自定义,继承runtimeException

hessian序列化工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
packagecom.uet.common.utils;
 
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
 
importcom.caucho.hessian.io.HessianSerializerInput;
importcom.caucho.hessian.io.HessianSerializerOutput;
importcom.uet.common.exception.SerializeException;
 
publicclassHessianObjectSerializeUtil {
    /**
     *
     * 纯hessian序列化
     *
     * @param <T>
     *
     * @param object
     *
     * @return
     *
     * @throws Exception
     */
 
    publicstatic<T>byte[] serialize(T object) {
        if(object ==null) {
            thrownewNullPointerException();
        }
        byte[] results =null;
        ByteArrayOutputStream os =null;
        HessianSerializerOutput hessianOutput =null;
        try{
            os =newByteArrayOutputStream();
            hessianOutput =newHessianSerializerOutput(os);
            //write本身是线程安全的
            hessianOutput.writeObject(object);
            os.close();
            results = os.toByteArray();
        }catch(Exception e) {
            thrownewSerializeException(e);
        }finally{
            try{
                if(os !=null)
                    os.close();
            }catch(IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        returnresults;
    }
 
    /**
     *
     * 纯hessian反序列化
     *
     * @param bytes
     *
     * @return
     *
     * @throws Exception
     */
 
    @SuppressWarnings("unchecked")
    publicstatic<T> T deserialize(Class<T> resultClass,byte[] bytes) {
        if(bytes ==null) {
            thrownewNullPointerException();
        }
        T result =null;
        ByteArrayInputStream is =null;
        try{
            is =newByteArrayInputStream(bytes);
            HessianSerializerInput hessianInput =newHessianSerializerInput(is);
            result = (T) hessianInput.readObject();
 
        }catch(Exception e) {
            thrownewSerializeException(e);
        }finally{
            try{
                if(is !=null)
                    is.close();
            }catch(IOException e) {
                thrownewSerializeException(e);
            }
        }
        returnresult;
 
    }
}



java自带的序列化工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
packagecom.uet.common.utils;
 
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.Closeable;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
 
importcom.uet.common.exception.SerializeException;
 
publicclassObjectsSerializeUtil{
 
    publicstatic<T>byte[] serialize(T value) {
        if(value ==null) {
            thrownewNullPointerException("Can't serialize null");
        }
        byte[] result =null;
        ByteArrayOutputStream bos =null;
        ObjectOutputStream os =null;
        try{
            bos =newByteArrayOutputStream();
            os =newObjectOutputStream(bos);
            os.writeObject(value);
            os.close();
            bos.close();
            result = bos.toByteArray();
        }catch(IOException e) {
            thrownewIllegalArgumentException("Non-serializable object", e);
        }finally{
            close(os);
            close(bos);
        }
        returnresult;
    }
 
    @SuppressWarnings("unchecked")
    publicstatic<T> T deserialize(Class<T> resultClass,byte[] in) {
        T result =null;
        ByteArrayInputStream bis =null;
        ObjectInputStream is =null;
        try{
            if(in !=null) {
                bis =newByteArrayInputStream(in);
                is =newObjectInputStream(bis);
                result = (T) is.readObject();
                is.close();
                bis.close();
            }
        }catch(IOException e) {
            thrownewSerializeException(String.format("Caught IOException decoding %d bytes of data", in ==null?0: in.length) + e);
        }catch(ClassNotFoundException e) {
            thrownewSerializeException(String.format("Caught CNFE decoding %d bytes of data", in ==null?0: in.length) + e);
        }finally{
            close(is);
            close(bis);
        }
        returnresult;
    }
    publicstaticvoidclose(Closeable closeable) {
        if(closeable !=null) {
            try{
                closeable.close();
            }catch(Exception e) {
                thrownewSerializeException(e);
            }
        }
    }
}

实验运行的类(BaseGrade您可以自己定义,但要实现Serializable接口)


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
packagecom.uet.common.utils;
 
importcom.uet.course.entity.BaseGrade;
 
publicclassSerializeTest {
    privatestaticintcount=10000;
    publicstaticvoidmain(String[] args)throwsException {
        /*BaseGrade grade = new BaseGrade();
        grade.setId(120L+10);
        grade.setName("唔年纪");
        grade.init();
        byte[] results=HessianObjectSerializeUtil.serialize(grade);*/
        //System.out.println(results.length);
        hessianObjectSerialize();
        javaObjectSerialize();
    }
    publicstaticvoidhessianObjectSerialize(){
        longstart = System.currentTimeMillis();
        for(inti=0;i<count;i++){
            BaseGrade grade =newBaseGrade();
            grade.setId(120L+i);
            grade.setName("唔年纪");
            grade.init();
            byte[] results=HessianObjectSerializeUtil.serialize(grade);
            BaseGrade result=HessianObjectSerializeUtil.deserialize(BaseGrade.class,results);
            //System.out.println(result.getId());
        }
        longend = System.currentTimeMillis();
        System.out.println("hessianObjectSerialize耗时:"+ ((end - start) /1000.0) +" seconds");
    }
    publicstaticvoidjavaObjectSerialize(){
        longstart = System.currentTimeMillis();
        for(inti=0;i<count;i++){
            BaseGrade grade =newBaseGrade();
            grade.setId(120L+i);
            grade.setName("唔年纪");
            grade.init();
            byte[] results=ObjectsSerializeUtil.serialize(grade);
            BaseGrade result=ObjectsSerializeUtil.deserialize(BaseGrade.class,results);
            //System.out.println(result.getId());
        }
        longend = System.currentTimeMillis();
        System.out.println("javaObjectSerialize耗时:"+ ((end - start) /1000.0) +" seconds");
    }
 
}



序列化的字节260btye

实验结果

循环1次(运行10次平均结果):

hessianObjectSerialize耗时:0.05 seconds
javaObjectSerialize耗时:0.01 seconds

循环10次(运行10次平均结果):

hessianObjectSerialize耗时:0.06 seconds
javaObjectSerialize耗时:0.015 seconds

循环100次(运行10次平均结果):

hessianObjectSerialize耗时:0.074 seconds
javaObjectSerialize耗时:0.04 seconds

循环1000次(运行10次平均结果):

hessianObjectSerialize耗时:0.162 seconds
javaObjectSerialize耗时:0.123 seconds

循环10000次(运行10次平均结果):

hessianObjectSerialize耗时:0.6 seconds
javaObjectSerialize耗时:0.47 seconds

循环100000次

hessianObjectSerialize耗时:4.668 seconds
javaObjectSerialize耗时:4.144 seconds

实验结论

java自身所带的方法明显比hessian自带的序列化效率更高。

来源究问社区博客:http://www.ijiuwen.com/blog/1004286372888576

转载请注明出处

© 著作权归作者所有

共有 人打赏支持
雨打芭蕉
粉丝 4
博文 2
码字总数 1125
作品 0
深圳
高级程序员
Java反序列化漏洞的原理分析

  *本文原创作者:Moonlightos,本文属FreeBuf原创奖励计划,未经许可禁止转载   世界上有三件事最难:      把别人的钱装进自己的口袋里   把自己的想法装进别人的脑袋里   让自...

FreeBuf ⋅ 05/04 ⋅ 0

《Spring技术内幕》学习笔记18——Spring使用Hessian实现远程调用

Spring目前提供了对RMI、 HttpInvoker、Hessian、Burlap及WebService等Remoting技术的集成。Spring屏蔽了这些实现技术的差异,用户只需开发简单的Java对象(Plain Old Java Objects,POJO)然后...

谜男amu ⋅ 05/16 ⋅ 0

Java序列化技术即将被废除!!!

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据...

Java技术栈 ⋅ 05/30 ⋅ 0

Oracle Java Mission Control 帮助

缩写 含义 JDK Java 开发工具包 JDP Java Discovery Protocol JFR Java 飞行记录器 JMC Java Mission Control JMX Java Management Extensions JVM Java 虚拟机 MBean 托管 Bean (Java) RCP ......

光斑 ⋅ 04/27 ⋅ 0

甲骨文称 Java 序列化的存在是个错误,计划删除

甲骨文计划从 Java 中去除序列化功能,因其在安全方面一直是一个棘手的问题。 Java 序列化也称为 Java 对象序列化,该功能用于将对象编码为字节流...Oracle 的 Java 平台小组的首席架构师 Ma...

达尔文 ⋅ 05/28 ⋅ 0

Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神 ⋅ 05/08 ⋅ 0

《JDK10新特性官方文档》-317:实验性的基于JAVA的JIT编译器

JEP 317: 实验性的基于JAVA的JIT编译器 原作者 Igor Veresov 创建日期 2017/10/20 20:03 更新日期 2018/03/28 01:58 类型 特点 状态 已关闭/ 已发布 组件 hotspot / 编译器 范围 JDK 详述...

Rudy ⋅ 01/18 ⋅ 0

Java堆和栈的区别,JVM的堆和栈的介绍

一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的...

光明辉煌 ⋅ 05/21 ⋅ 0

甲骨文开源Java 性能监控调试工具 JMC

JMC (Java Mission Control) 是Oracle开源的Java 性能监控调试工具, 源自 JRockit JVM , 主要由三个组件构成:Java 进程浏览器、JMX 控制台和 Java Flight 记录器。 主要特性: Java 进程浏览...

marsdream ⋅ 05/07 ⋅ 0

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 14分钟前 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

楠木楠 ⋅ 26分钟前 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 55分钟前 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 55分钟前 ⋅ 0

Docker Toolbox Looks like something went wrong

Docker Toolbox 重新安装后提示错误:Looks like something went wrong in step ´Checking if machine default exists´ 控制面板-->程序与应用-->启用或关闭windows功能:找到Hyper-V,如果处......

随你疯 ⋅ 今天 ⋅ 0

Guacamole 远程桌面

本文将Apache的guacamole服务的部署和应用,http://guacamole.apache.org/doc/gug/ 该链接下有全部相关知识的英文文档,如果水平ok,可以去这里仔细查看。 一、简介 Apache Guacamole 是无客...

千里明月 ⋅ 今天 ⋅ 0

nagios 安装

Nagios简介:监控网络并排除网络故障的工具:nagios,Ntop,OpenVAS,OCS,OSSIM等开源监控工具。 可以实现对网络上的服务器进行全面的监控,包括服务(apache、mysql、ntp、ftp、disk、qmail和h...

寰宇01 ⋅ 今天 ⋅ 0

AngularDart注意事项

默认情况下创建Dart项目应出现以下列表: 有时会因为不知明的原因导致列表项缺失: 此时可以通过以下步骤解决: 1.创建项目涉及到的包:stagehand 2.执行pub global activate stagehand或pub...

scooplol ⋅ 今天 ⋅ 0

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部