编解码_qq_320253624的博客-程序员信息网

技术标签: netty  

1.什么是编解码

对于java提供的对象输入输出流ObjectInputStream与ObjectOutputStream,可以直接把java对象作为可存储 的字节数组写入文件,也可以传输到网络上去。对与java开放人员来说,默认的jdk序列化机制可以避免操作底层的字节数组,从而提升开发效率。

1.为什么需要序列化

网络传输与对象序列化

2.java编解码技术指的什么

netty nio是基于网络传输,当进行远程跨进程服务调用时,需要把被传输的对象编码为字节数组或者bytebuffer对象。而当远程服务读取到bytebuffer对象或字节数组时,需要将其解码发送时候的java对象。这个就是java对象的编解码技术。

3.java原生态序列化的缺点

(1)无法跨语言,这个是最致命的问题。当跨进程服务调用,其余语言,如与c++交互时,java序列化难以胜任。java序列化用的是java内部私有协议

(2)序列化后码流太大

2.常见编解码框架

Google · Protobuf 编解码
1、Protobuf 全称 Google Protocol Buffers,由谷歌开源而来,在谷歌内部久经考验。它将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象和 Protobuf 相关的属性和方法。

2、Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化。它很适合做数据存储或 RPC 数据交换。

3、Protobuf 在 Github 开源地址:https://github.com/protocolbuffers/protobuf

 Protobuf supports several different programming languages. For each programming language, you can find instructions in the corresponding source directory about how to install protobuf runtime for that specific language:

4、Protobuf 另一个吸引人的是它的数据描述文件和代码生成机制。利用数据描述文件对数据结构进行说明,其优点如下:

1)文本话的数据结构描述语言,可以实现语言和平台无关,特别适合异构系统间的集成

2)通过标识字段的顺序,可以实现协议的前后兼容

3)字段代码生成,不需要手工编写同样数据结构的 C++ 和 Java 版本

4)方便后续的管理和维护,相比于代码,结构化的文档更易管理和维护

Facebook · Thrift 编解码
1、Thrift 源于 Facebook,创建的目的是为了解决 Facebook 各系统间大数据量的传输通信问题,满足系统之间语言环境不同的需求。Thrift 可以支持多种程序语言:

 The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.

2、2007 年 Facebook 将 Thrift 作为一个开源项目提交给 Apache 基金会,Apache Thrift 官网地址:http://thrift.apache.org/

3、在多种不同的语言之间通信,Thrift 可以作为高性能的通信中间件使用,它支持数据(对象)序列化和多种类型的 RPC 服务。Thrift 适用于静态的数据交换,需要先确定好它的数据结构,当数据结构发生变化时,必须重新编辑 IDL 文件,生成代码和编译,这一点和其它 IDL 工具相比是 Thrift 的弱项。Thrift 适用于搭建大型数据交换及存储的使用工具,对于大型系统中的内部数据传输,相比于 JSON 和 XML 在性能和传输大小上都有明显的优势。

4、Thrift 主要由 5 部分组成:

1)语言系统以及 IDL 编译器:负责由用户给定的 IDL 文件生成相应语言的接口代码;

2)TProtocol:RPC 的协议层,可以选择多种不同的对象序列化方式,如 JSON 和 Binaru;

3)TTransport:RPC 的传输层,同样可以选择不同的传输层实现,如 Socket、NIO、MemoryBuffer 等;

4)TProcessor:作为协议层和用户提供的服务实现之间的纽带,负责调用服务实现的接口;

5)TServer:聚合 TProtocol、TTransport、TProcessor 等对象。

5、对于编解码框架,与之对应的就是 TProtocol 。由于 Thrift 的 RPC 服务调用和编解码框架绑定在一起,所以通常使用 Thrift 的时候会采取 RPC 框架的方式,但是它的 TProtocol 编解码框架还是可以以类库的方式独立使用的

6、Thrift 通过 IDL 描述接口和数据结构定义,它支持Java 8 种基本类型、Map、List、Set,支持可选和必选定义,功能非常强大。因此可以定义数据结构中的字段的顺序,可以支持协议的前向兼容。

7、Thrift 支持三种比较典型的编解码方式:

1)通用的二进制编解码

2)压缩的二进制编解码

3)优化的可选字段压缩编解码

8、由于支持二进制压缩编解码,所以 Thrift 的编解码性能表现也相当优异,远远超过 Java 序列化和 RMI 等。

Jboos · Marshaling 编解码
1、JBoss Marshalling 是一个 Java 对象的序列化 API 包,修正了 JDK 自带的序列化包的很多问题,但又保持跟 java.io.Serializable 接口的兼容。同时增加了一些可调的参数和附加的特性,并且这些参数和特性可通过工厂类进行配置。

2、JBoss Marshalling 官网地址:http://jbossmarshalling.jboss.org/

3、Marshalling 在 GitHub 开源地址:https://github.com/jboss-remoting/jboss-marshalling

4、相比于传统的 Java 序列化机制,Marshalling 的优点如下:

1)可插拔的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制;

2)可插拔的预定义类缓存表,可以减小序列化的字节数组的长度,提升常用类型的对象序列化性能;

3)无需再实现 java.io.Serializable 接口,即可实现 Java 序列化;

4)通过缓存技术提升对象的序列化性能。

MessagePack 编解码
It’s like JSON.but fast and small.

MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it’s faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.

它像 JSON,但是更快更小。
MessagePack 是一种高效的二进制序列化格式。它允许您在 JSON 等多种语言之间交换数据,但它更快速更小巧。小整数被编码为单个字节,典型的短字符串除了字符串本身之外只需要一个额外的字节。

MessagePack 官网地址:https://msgpack.org/

MessagePack GitHub 开源地址:https://github.com/msgpack/msgpack

MessagePack Java 模块 GitHub 开源地址:https://github.com/msgpack/msgpack-java

核心压缩方式可参看官方说明:https://github.com/msgpack/msgpack/blob/master/spec.md

MessagePack is supported by over 50 programming languages and environments.(MessagePack 支持主流的 50 多种编程语言)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36331657/article/details/116568110

智能推荐

Struts2学习笔记(二):Action 的三种开发模式_秋忆夏伤的博客-程序员信息网_action模式

项目结构:UserAction.java:/** * Action 的开发模式1:继承 ActionSupport 类; * 如果使用 struts 的数据校验功能,必须继承 ActionSupport; */public class UserAction extends ActionSupport { /** * Action 中业务处理方法 ...

Cocos2d-x学习之创建Android工程和编译_weixin_33881753的博客-程序员信息网

2019独角兽企业重金招聘Python工程师标准>>> ...

A. 实验11_4_初识链表_ヾ Hushつ的博客-程序员信息网

题目描述问题描述:已知一个正整数序列,个数未知,但至少有一个元素,你的任务是建立一个单链表,并使用该链表存储这个正整数序列,然后统计这个序列中元素的最大值与最小值,计算序列全部元素之和。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。输入与输出要求:输入一个正整数序列,正整数序列元素的个数未知,但以输入“-1”结束,输入“-1”前至少输入一个正整数。序列中...

GitHub标星8k!首发10万字Java开发实战文档,经验分享_普通网友的博客-程序员信息网

开头Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新,很多研发人员把spring看作心目中最好的Java项目,没有之一。**可以毫不夸张的说,Spring重新定义了Java,**所以这是重点也是难点,工作中必须会,面试时肯定考,不过很多人在面试的时候在简历上写着熟悉Spring,但也不过只是会用SSM,在这个基础上做crud罢了,对于Spring全家桶里面其他技术点真的有所掌握吗?Spri

iphone12里的计算机,iPhone12来了!性价比超高的11还值得买吗?_这块必被安排的博客-程序员信息网

iPhone12来了!性价比超高的11还值得买吗?2020-09-11 09:34:461点赞0收藏0评论大家好,我是科技君的探讨,欢迎关注我,与我一起进行科技的探讨。iPhone12终于来了!那么iPhone11及前几代iPhone该不该买呢?这个问题很值得回味。毕竟iPhone12作为苹果首款5G手机,可以说是5G时代的先锋,而前几代iPhone只能在5G真正普及之时也该正式脱轨,但是到那时候...

一文拆解中国火星车着陆全过程_人工智能学家的博客-程序员信息网

天问一号着陆器降落火星(艺术图)来源:深城物联经过惊心动魄的九分钟,中国首个火星车祝融号成功穿越火星大气层,着陆于火星北半球的乌托邦平原南端。自此,继苏联和美国之后,中国成为了第三个...

随便推点

【前端】easyUI可编辑行(年-月格式)日期输入控件的实现_扣钉的博客-程序员信息网

背景:项目中,用datagrid的可编辑行实现对业务信息的录入其中包括日期字段的录入在以往的开发中常常见到的是这种(easyUI日期输入框):<input class="easyui-datebox"id="xxx" name="xxx" required="true"/>既非可编辑行的日期控件和这种(datagrid日期输入框):&lt...

java json merge_java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMerge_古德猫的靴子的博客-程序员信息网

Run a Jackson related project and hits the following JsonMerge not found error.Consolejava.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMergeat com.fasterxml.jackson.databind.intros...

Python脚本运行出现语法错误:IndentationError: unindent does n_chuanping7294的博客-程序员信息网

【问题】一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误:IndentationError: unindent does not match any outer indentation level 【解决过程】1.对于此...

java 这些年的发展过程_完美--一击的博客-程序员信息网

Java 语言的发展回顾Java 语言源于 1991 年 Sun 公司 James Gosling 领导的的 Ork 项目,1995 年 Sun 公司正式起名为 Java,并提出“Write once, Run anywhere"的口号。1996 年 1 月 java 1.0 发布,提供了一个解释执行的 Java 虚拟机,其时恰逢互联网开始兴起,Java 的 Applet 能在 Mozil

LeetCode 141. 环形链表 做题笔记_从零开始的数据猿的博客-程序员信息网

题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,2,0,-4

git,svn等开发工具的使用_2314134918的博客-程序员信息网

git1.git的安装在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。Git 各平台安装包下载地址为:http://git-scm.com/downloads2.git的定义Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subve