当前位置:首页 > Web开发 > 正文

Apache Thrift系列详解(三)

2024-03-31 Web开发

Thrift撑持二进制压缩格局,以及json格局数据的序列化反序列化。开发人员可以越发灵活的选择协议的具体形式。协议是可自由扩展的,新版本的协议,完全兼容老的版本!

正文 数据交换格局简介

当前风行的数据交换格局可以分为如下几类:

(一) 自解析型

序列化的数据包罗完整的布局, 包罗了field名称和value。好比xml/json/java serizable,大百度的mcpack/compack,都属于此类。即调解差别属性的挨次序列化/反序列化不造成影响。

(二) 半解析型

序列化的数据,抛弃了部分信息, 好比field名称, 但引入了index(每每是id+type的方法)来对应具体属性。这方面的代表有google protobuf/thrift也属于此类。

(三) 无解析型

传说中大百度的infpack实现,就是借助该种方法来实现,,抛弃了很多有效信息性能/压缩比最好,不过向后兼容需要开发做必然的事情, 详情不知。

交换格局类型长处错误谬误
Xml   文本   易读   痴肥,不撑持二进制数据类型  
JSON   文本   易读   抛弃了类型信息,好比"score":100,对score类型是int/double解析有二义性, 不撑持二进制数据类型  
Java serizable   二进制   使用简单   痴肥,只限制在JAVA范围  
Thrift   二进制   高效   不易读,向后兼容有必然的约定限制  
Google Protobuf   二进制   高效   不易读,向后兼容有必然的约定限制  
Thrift的数据类型

根基类型:   bool: 布尔值   byte: 8位有标记整数   i16: 16位有标记整数   i32: 32位有标记整数   i64: 64位有标记整数   double: 64位浮点数   string: UTF-8编码的字符串   binary: 二进制串

布局体类型:   struct: 界说的布局体东西

容器类型:   list: 有序元素列表   set: 无序无反复元素调集   map: 有序的key/value调集

异常类型:   exception: 异常类型

处事类型:   service: 具体对应处事的类

Thrift的序列化协议

Thrift可以让用户选择客户端处事端之间传输通信协议的类别,在传输协议上总体划分为文本(text)和二进制(binary)传输协议。为节约带宽提高传输效率,一般情况下使用二进制类型的传输协议为大都,有时还会使用基于文本类型的协议,这需要按照项目/产品中的实际需求。常用协议有以下几种:

TBinaryProtocol:二进制编码格局进行数据传输

TCompactProtocol:高效率的、密集二进制编码格局进行数据传输

TJSONProtocol: 使用JSON文本的数据编码协议进行数据传输

TSimpleJSONProtocol:只供给JSON只写的协议,适用于通过脚本语言解析

Thrift的序列化测试

(a). 首先编写一个简单的thrift文件pair.thrift:

struct Pair { 1: required string key 2: required string value } 复制代码

这里标识了required的字段,要求在使用时必需正确赋值,否则运行时会抛出TProtocolException异常。缺省和指定为optional时,则运行时不做字段非空校验。

(b). 编译并生成java源代码:

thrift -gen java pair.thrift 复制代码

(c). 编写序列化和反序列化的测试代码:

序列化测试,将Pair东西写入文件中

private static void writeData() throws IOException, TException { Pair pair = new Pair(); pair.setKey("key1").setValue("value1"); FileOutputStream fos = new FileOutputStream(new File("pair.txt")); pair.write(new TBinaryProtocol(new TIOStreamTransport(fos))); fos.close(); } 复制代码

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32041.html