为了账号安全,请及时绑定邮箱和手机立即绑定

腾讯T4之路:Java对象序列化

在微服务架构中,网络带宽成为决定并发的主要因素之一。对象的传递在不同服务直接很常见,对象的传递要经过序列化和反序列化。

序列化:将对象转换成二进制流的过程,称为序列化

反序列化:将二进制流转换成对象的过程,称为反序列化

那么,选择一种高效的序列化和反序列化方法,就可以提升整个架构的性能。

使用java原生方式实现序列化和反序列化:

public void javaObjByte(Person person) throws IOException, ClassNotFoundException {
    long startTime = System.nanoTime();

    // 序列化
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(os);
    out.writeObject(person);
    byte[] personByte = os.toByteArray();
    System.out.println("java length: " + personByte.length);

    // 反序列化
    ByteArrayInputStream is = new ByteArrayInputStream(personByte);
    ObjectInputStream in = new ObjectInputStream(is);
    Person zhangsan = (Person)in.readObject();

    long endTime = System.nanoTime();
    System.out.println("java: " + (endTime - startTime));
}

使用Hessian进行序列化和反序列化:

public void hessianObjByte(Person person) throws IOException {
    long startTime = System.nanoTime();

    // 序列化
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    HessianOutput ho = new HessianOutput(os);
    ho.writeObject(person);
    byte[] personByte = os.toByteArray();
    System.out.println("hess length: " + personByte.length);

    // 反序列化
    ByteArrayInputStream is = new ByteArrayInputStream(personByte);
    HessianInput hi = new HessianInput(is);
    Person zhangsan = (Person)hi.readObject();

    long endTime = System.nanoTime();
    System.out.println("hess: " + (endTime - startTime));
}

Person类:

public class Person implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    String name;
    Integer age;
    Boolean sex;
    Integer height;

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", height=" + height + "]";
    }

    public Person() {
        super();
    }

    public Person(String name, Integer age, Boolean sex, Integer height) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Boolean getSex() {
        return sex;
    }
    public void setSex(Boolean sex) {
        this.sex = sex;
    }
    public Integer getHeight() {
        return height;
    }
    public void setHeight(Integer height) {
        this.height = height;
    }

}

运行十次结果(Java虚拟机运行的纳秒数):

java length: 267
java: 64303484
hess length: 62
hess: 63746841
++++++++++++++++
java length: 267
java: 402568
hess length: 62
hess: 249284
++++++++++++++++
java length: 267
java: 464198
hess length: 62
hess: 213729
++++++++++++++++
java length: 267
java: 393087
hess length: 62
hess: 227951
++++++++++++++++
java length: 267
java: 495013
hess length: 62
hess: 165531
++++++++++++++++
java length: 267
java: 358717
hess length: 62
hess: 218074
++++++++++++++++
java length: 267
java: 496198
hess length: 62
hess: 175803
++++++++++++++++
java length: 267
java: 427457
hess length: 62
hess: 137086
++++++++++++++++
java length: 267
java: 501729
hess length: 62
hess: 180939
++++++++++++++++
java length: 267
java: 527803
hess length: 62
hess: 179358
++++++++++++++++

可以看到上面的运行结果,除了第一次受到Java虚拟机启动的影响,耗时几乎一样外,其余几次都是Hessian以绝对的优势领先Java内置的序列化方法,并且序列化后对象的体积也只有Java序列化的三分之一。这就意味着,采用hessian序列化的架构,在并发上可以增加两倍以上的流量。

hessian的jar版本为4.0.51

作者:秋名山车神

感言:希望能以此系列文章,记录自己探索T4的路。

T4工程师:腾讯内部的级别。T4专家组是腾讯最为核心的部门,每当项目遇到重大技术问题就会由T4专家组协助,如:QQ空间代码重构,微信摇一摇和春节抢红包亿级并发。代表了编程水平的最高境界,再往上的T5和T6已经不是单纯的技术积累能够做到的了。T4成为T6只有一条路,那就是用自己的技术创造出新的技术,改变人类,改变世界。

点击查看更多内容
26人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消