Java原生序列化和二进制序列化性能比较

序列化速度

package com.clq.netty.serializable;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.nio.ByteBuffer;

/**

* Created by clq on 2018/7/20.

*/

public class UserInfo implements Serializable{

private String name;

private int id;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public byte[] CodeC(ByteBuffer byteBuffer) {

byteBuffer.clear();

// ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

byte[] bytes = this.getName().getBytes();

byteBuffer.putInt(bytes.length);

byteBuffer.put(bytes);

byteBuffer.putInt(this.getId());

byteBuffer.flip();

bytes = null;

byte [] bytes1 = new byte[byteBuffer.remaining()];

byteBuffer.get(bytes1);

return bytes1;

}

public static void main(String[] args) throws IOException {

UserInfo userInfo = new UserInfo();

userInfo.setId(1234);

userInfo.setName("Welcome to Serializable");

long begin = System.currentTimeMillis();

for(int i=0; i<1000000; i++) {

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bos);

oos.writeObject(userInfo);

oos.flush();

oos.close();

byte[] bytes = bos.toByteArray();

bos.close();

}

System.out.println("Java序列化耗时: "+(System.currentTimeMillis()-begin)+"ms");

ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

Long start =System.currentTimeMillis();

for(int i=0;i<1000000;i++) {

byte[] bytes = userInfo.CodeC(byteBuffer);

}

System.out.println("二进制序列化:"+(System.currentTimeMillis()-start)+"ms");

// System.out.println("JDK Serializable length:"+bytes.length);

// System.out.println("NIO Serializable length:"+userInfo.CodeC().length);

}

}

打印结果: Java序列化耗时: 1388ms 二进制序列化:118ms java原生序列化的速度是二进制序列化速度的 8.19%

序列化大小

public static void main(String[] args) throws IOException {

UserInfo userInfo = new UserInfo();

userInfo.setId(1234);

userInfo.setName("Welcome to Serializable");

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bos);

oos.writeObject(userInfo);

oos.flush();

oos.close();

byte[] bytes = bos.toByteArray();

bos.close();

System.out.println("JDK Serializable length:"+bytes.length);

ByteBuffer buffer = ByteBuffer.allocate(1024);

System.out.println("NIO Serializable length:"+userInfo.CodeC(buffer).length);

}

JDK Serializable length:119 二进制 Serializable length:31 jdk序列化大小是二进制序列化大小的3.83倍

二进制字节码

java序列化

aced 0005 7372 0023 636f 6d2e 636c 712e

6e65 7474 792e 7365 7269 616c 697a 6162

6c65 2e55 7365 7249 6e66 6fb5 d8bd 7f01

280b d402 0002 4900 0269 644c 0004 6e61

6d65 7400 124c 6a61 7661 2f6c 616e 672f

5374 7269 6e67 3b78 7000 0004 d274 0017

5765 6c63 6f6d 6520 746f 2053 6572 6961

6c69 7a61 626c 65

二进制序列化

0000 0017 5765 6c63 6f6d 6520 746f 2053

6572 6961 6c69 7a61 626c 6500 0004 efbf

bd

原因分析

java的序列化后的码流可以得出: Java本身并不支持跨语言,因为加入了序列化版本号,类名等信息,所以导致码流变大,速度变慢。

java 序列化慢_java原生序列化慢在哪里?相关推荐

  1. java里面序列化作用_java中序列化的作用

    一  什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...

  2. java序列化库_java 中序列化(Serializable)

    18年5月份,在毕业快一年的时候,我终于把自己从研发助理偏向行政打杂,偶尔写一些前端代码的处境,回归到了初衷-安安静静写前后端代码的小小程序员~过程中的心酸也就不在这里吐啦,毕竟我是小太阳,永不熄灭的 ...

  3. java序列化异常_Java|序列化异常StreamCorruptedException的解决方法

    参考:http://tristan1.iteye.com/blo...public void testDeserialize() throws IOException, ClassNotFoundEx ...

  4. java 屏幕识别_java原生实现屏幕设备遍历和屏幕采集(捕获)等功能

    前言:本章中屏幕捕获使用原生java实现,屏幕图像显示采用javacv1.3的CanvasFrame javacv系列: 补充篇: 一.实现的功能 1.屏幕设备遍历 2.本地屏幕图像采集(也叫屏幕图像 ...

  5. java隐藏字符_Java原生隐藏字符-工具类

    package com.seesun2012.common.util; /** 隐藏字符-工具类 @author seesun2012@163.com */ public class HiddenCh ...

  6. avro和java原生序列化的区别,java原生序列化和Kryo序列化性能比较

    简介 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf,Thrift, ...

  7. Java原生序列化、Avro、RPC与Log4j

    目录 一.Java原生序列化机制 1.序列化作用 2.Java原生序列化的局限性 3.案例演示

  8. 【java】java原生序列化和Kryo序列化性能实例对比分析

    1.美图 2.概述 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf, ...

  9. java对象序列化作用_Java学习之——理解对象序列化

    Java的对象序列化就是把对象写入到输出流中,用来存储或传输:反序列化就是从输入流中读取对象.简单的来说是指将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 ...

最新文章

  1. SublineText 3 安装 Package Control插件
  2. Manning、Ostendorf、Povey、何晓冬、周明共话多模态NLP的机遇和挑战(附视频)
  3. python读excel乱码_Python读写excel练习_去除excel中乱码行,并添加列
  4. java中向JTextArea中添加滚动条(垂直的和水平的)
  5. Clipboard.js复制粘贴到剪贴板
  6. 深度学习笔记(30) Inception网络
  7. 如何在 Spring 中自定义 scope
  8. Oracle数据库中序列用法讲解(转)
  9. pt和px区别 pt是逻辑像素,px是物理像素
  10. Kalman Fuzzy Actor-Critic Learning Automaton Algorithm for the Pursuit-Evasion Differential Game
  11. 【JUC高并发编程】—— 初见JUC
  12. iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手
  13. 数据库系统概论复习提纲
  14. [Jupyter Notebook]导出好看的中文PDF
  15. 汇编语言编程题总结(特别适用河北专接本)
  16. 继承Handler还是实现Handler.Callback?
  17. BIOS 工作流程解析
  18. 英语宾语从句 引导词的选择
  19. 200、无线网桥与无线AP的带机量是多少?一篇文章搞明白
  20. Codeforces Round #702 (Div. 3)全部题解

热门文章

  1. 试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数
  2. 阿里云服务器安装Ubuntu图形化界面
  3. 基于Java的webapp_几乎所有基于Java的web app都需要Model 2 (part II) (转)
  4. 目标检测--Feature Pyramid Networks for Object Detection
  5. Linux: debian/ubuntu下安装Neo4j
  6. java四种xml_Java中四种XML解析技术
  7. 为什么要低温保存_渔之歌科普课堂:冷冻食品为什么要规定零下18摄氏度冷藏?...
  8. C++:uniform_int_distribution、rand()和mt19937随机数、partial_sum、容器最小值和最大值、accumulate
  9. linux日志手机,通过 shell 脚本 自动发送 log日志 文件内容 到手机邮箱
  10. Jvm 系列(十):Java 即时编译器JIT机制以及编译优化