java序列化 jar,腾讯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只有一条路,那就是用自己的技术创造出新的技术,改变人类,改变世界。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值