文档章节

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

雨打芭蕉
 雨打芭蕉
发布于 2015/02/13 14:39
字数 1052
阅读 178
收藏 1

序列化的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
博文 4
码字总数 1125
作品 0
深圳
高级程序员
几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据

别人的相关测试数据: http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking 测试纬度 序列化时间 反序列化时间 bytes大小 测试代码 准备protobuf文件 Message.proto文件代码...

SANSOM
2015/08/20
0
0
FastJson---高性能JSON开发包

Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。 1、遵循http://json.org标准,为其官方网站收录的参考实现之一。 2、功能qiang打,支持JDK的各种类型,包括基本...

Zero零_度
2015/11/13
0
0
java 几种远程服务调用协议的比较

一、综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能。 RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的...

哈全文
2012/09/12
0
0
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
34分钟前
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
39分钟前
1
0
905. Sort Array By Parity - LeetCode

Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list,一个放偶数,一个放奇数,最...

yysue
44分钟前
1
0
h5 禁止手机自带键盘弹出

html: <div style="width: 350px;margin:50px auto;"><input type="text" id="datePicker" class="date_picker form-control" placeholder="点击选择入住日期" /></div> js: $("#date......

Delete90
今天
1
0
color透明度对照表

透明度百分比 数值 100% 不透明 FF 95% F2 90% E6 85% D9 80% CC 75% BF 70% B3 65% A6 60% 99 55% 8C 50% 80 45% 73 40% 66 35% 59 30% 4D 25% 40 20% 33 15% 26 10% 1A 5% 0D 0% 完全透明 ......

_无问西东
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部