目录

​1 Java序列化的缺点

2 业界主流的编解码框架

2.1 Google的Protobuf介绍

2.2 Facebook的Thrift介绍

2.3 JBoss Marshalling介绍


第6章 编解码技术


1 Java序列化的缺点

java序列化通过实现Serializable接口来实现

  • 无法跨语言
  • 序列化后的码流太大
  • 序列化性能太低

java序列化的两个目的:网络传输和对象的持久化

对比的是java原生序列化和二进制序列化

java序列化方案:首先把对象信息写到ObjectOutputStream 中,然后再写到ByteArrayOutputStream 中,最后写到字节数组中;

二进制序列化方案:首先把name字段占用的大小写入,然后写入name的值,最后写入id;

用于测试序列化码流大小和序列化性能的对象

public class UserInfo implements Serializable {/*** 默认的序列号*/private static final long serialVersionUID = 1L;private String userName;private int userID;public UserInfo buildUserName(String userName) {this.userName = userName;return this;}public UserInfo buildUserID(int userID) {this.userID = userID;return this;}/*** @return the userName*/public final String getUserName() {return userName;}/*** @param userName*            the userName to set*/public final void setUserName(String userName) {this.userName = userName;}/*** @return the userID*/public final int getUserID() {return userID;}/*** @param userID*            the userID to set*/public final void setUserID(int userID) {this.userID = userID;}public byte[] codeC() {ByteBuffer buffer = ByteBuffer.allocate(1024);byte[] value = this.userName.getBytes();buffer.putInt(value.length);buffer.put(value);buffer.putInt(this.userID);buffer.flip();value = null;byte[] result = new byte[buffer.remaining()];buffer.get(result);return result;}public byte[] codeC(ByteBuffer buffer) {buffer.clear();byte[] value = this.userName.getBytes();buffer.putInt(value.length);buffer.put(value);buffer.putInt(this.userID);buffer.flip();value = null;byte[] result = new byte[buffer.remaining()];buffer.get(result);return result;}
}

测试码流大小:

public class TestUserInfo {/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {UserInfo info = new UserInfo();info.buildUserID(100).buildUserName("Welcome to Netty");ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream os = new ObjectOutputStream(bos);os.writeObject(info);os.flush();os.close();byte[] b = bos.toByteArray();System.out.println("The jdk serializable length is : " + b.length);bos.close();System.out.println("-------------------------------------");System.out.println("The byte array serializable length is : " + info.codeC().length);}}

输出:

The jdk serializable length is : 127
-------------------------------------
The byte array serializable length is : 24

测试序列化性能:

public class PerformTestUserInfo {/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {UserInfo info = new UserInfo();info.buildUserID(100).buildUserName("Welcome to Netty");int loop = 1000000;ByteArrayOutputStream bos = null;ObjectOutputStream os = null;long startTime = System.currentTimeMillis();for (int i = 0; i < loop; i++) {bos = new ByteArrayOutputStream();os = new ObjectOutputStream(bos);os.writeObject(info);os.flush();os.close();byte[] b = bos.toByteArray();bos.close();}long endTime = System.currentTimeMillis();System.out.println("The jdk serializable cost time is  : " + (endTime - startTime) + " ms");System.out.println("-------------------------------------");ByteBuffer buffer = ByteBuffer.allocate(1024);startTime = System.currentTimeMillis();for (int i = 0; i < loop; i++) {byte[] b = info.codeC(buffer);}endTime = System.currentTimeMillis();System.out.println("The byte array serializable cost time is : " + (endTime - startTime) + " ms");}}

输出:

The jdk serializable cost time is  : 2029 ms
-------------------------------------
The byte array serializable cost time is : 135 ms

2 业界主流的编解码框架

2.1 Google的Protobuf介绍

2.2 Facebook的Thrift介绍

2.3 JBoss Marshalling介绍

netty权威指南---编解码技术相关推荐

  1. Netty之编解码技术(四)

    通常我们习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decode)称为反序列化(deseriali ...

  2. Netty详解(六):Netty 编解码技术

    1. 概述 基于Java提供的对象输入/输出流ObjectInputStream和ObjectOutputStream,可以直接把Java对象作为可村粗的字节数组写入文件,也可以传输到网络上去.Jav ...

  3. 《Netty权威指南》

    <Netty权威指南> 基本信息 作者: 李林锋 出版社:电子工业出版社 ISBN:9787121233432 上架时间:2014-5-29 出版日期:2014 年6月 开本:16开 页码 ...

  4. 《Netty权威指南》笔记 —— 第二十、二十一、二十二, 二十三章

    <Netty权威指南>笔记--Netty高级特性 第20章 Netty架构剖析 Reactor通信调度层 职责链 ChannelPipeline 业务逻辑编排层 关键架构质量属性 高性能 ...

  5. [201504][Netty 权威指南][第2版][李林锋][著]

    [201504][Netty 权威指南][第2版][李林锋][著] https://github.com/wuyinxian124/nettybook2 基础篇 走进 Java NIO 第 1 章 J ...

  6. IT人物之《Netty权威指南》中文作者 专访华为李林锋:我与Netty那些不得不说的事

    摘要:Netty是业界最流行的NIO框架之一,它的健壮性.功能.性能.可定制性和可扩展性在同类框架中都是首屈一指的.近日,CSDN采访了Netty领域的权威人士李林锋,请他分享Netty开发的经验之道 ...

  7. netty权威指南 学习笔记http

    序 李林峰的<netty权威指南>,从Java的NIO开始介绍,后面介绍TCP粘包拆包.中级篇介绍编解码技术. 第10章介绍了HTTP及netty HTTP+XML的技术. 因为xml实际 ...

  8. netty权威指南目录

    目录 第一版 第二版 第一版 目录 基础篇 走进Java NIO 第1章 Java的I/O演进之路 1.1 I/O基础入门 1.1.1 Linux网络I/O模型简介 1.1.2 I/O多路复用技术 1 ...

  9. 《Netty权威指南 第2版》学习笔记(1)---服务端与客户端开发入门

    前言 Netty权威指南中以时间服务器为入门案例,演示了如何通过Netty完成了服务端与客户端之间的交互过程. 在开始使用Netty开发之前,先回顾一下使用NIO进行服务端开发的步骤. 创建Serve ...

  10. [总结]视音频编解码技术零基础学习方法

    原文地址:http://blog.csdn.net/leixiaohua1020/article/details/18893769 一直想把视音频编解码技术做一个简单的总结,可是苦于时间不充裕,一直没 ...

最新文章

  1. 17条避坑指南:一份来自谷歌的数据库经验贴
  2. python里面temp是啥-请问Python里temp是什么意思?
  3. VTK:可视化之CubeAxesActor2D
  4. SSLOJ 1336.膜拜神牛
  5. kaggle之手写体识别
  6. AWG标准线径规格对照表 (2
  7. 作为非计算机专业的我,是如何拿下软考软件设计师的?
  8. QQ,MSN,旺旺在线客服代码
  9. 虚拟机安装的Ubuntu下载速度慢怎么办
  10. 写在最后——如何做好一个语音助手
  11. python的ls是什么意思_谏言给那些想学Python的人,建议收藏后细看!
  12. [CSP-S模拟测试]:砍树(数学+模拟)
  13. 十行代码让你的单机“影分身”,分布式训练速度快到飞起
  14. IOS5短信拦截怎么实现?
  15. 视觉感知在数据可视化中的作用
  16. 茅台抢购特产平台(葫芦娃)
  17. [软件项目管理] BCWS、BCWP、ACWP的理解
  18. excel合并多个工作表_简单快速多个Excel表合并成一个Excel表
  19. myet: 练习英语口语不错
  20. JavaWeb完整笔记

热门文章

  1. 9、【易混淆概念集】-第五章 2 WBS 需求文件 VS 需求跟踪矩阵 确认范围 VS 控制质量 确认范围 VS 控制范围
  2. 关于计算机的病毒案例分析,实例解析蠕虫病毒的原理 -电脑资料
  3. Head First Python
  4. 关于DllRegisterServer的调用失败的问题解决办法 错误代码0x80040201
  5. DOS批处理命令之for命令(批量安装APK)
  6. pdf editor android,MaxiPDF PDF editor builder
  7. sunlight的中文_Diana Vickers的Sunlight中文歌词。
  8. 通用网络版本md5算法和.net中md5算法接轨
  9. 如何把map的value转为list_Java 8 将Map转换为List
  10. CentOS6.5 yum源配置