1.首先我们先来定义下thrift的简单结构。
required修饰符你肯定能猜测到它的意义, 但是你是否有没有这样的疑惑, "1", "2" 这些数字标识符究竟有何含义? 它在序列化机制中究竟扮演什么样的角色?
编译并进行
thrift -gen java <your thrift file>
2.编写测试代码
调用writeData(), 把pair{key=> rowkey, value=> column-family} 写入文件1.dat中
3.如果我重新定义pair结构, 调整数字编号数序
评注: 这边2对应key, 1对应value.
重新编译thrift -gen java <your thrift file>
4.然后读取该数据
调用readData(), 从文件1.dat中恢复Pair对象来。
结果:
key => column-family
value => rowkey
是不是和你预期的相反, 看来属性名称并没有发挥作用, 而id标识在thrift的序列化/反序列化扮演非常重要的角色。带着这些疑惑, 我们进一步的详细解读序列化机制。
thrift 数据格式描述
官网文档描述: http://thrift.apache.org/static/files/thrift-20070401.pdf
Versioning in Thrift is implemented via field identifiers. The field header for every member of a struct in Thrift is encoded with a unique field identifier. The combination of this field identifier and its type specifier is used to uniquely identify the field. The Thrift definition language supports automatic assignment of field identifiers, but it is good programming practice to always explicitly specify field identifiers.
翻译: thrift的向后兼容性(Version)借助属性标识(数字编号id + 属性类型type)来实现, 可以理解为在序列化后(属性数据存储由 field_name:field_value => id+type:field_value), 这也解释了上述提到的场景的原因了。
对之前定义的Pair结构体, 进行代码解读:
从恢复对象的函数中, 我们也可以对thrift定义的序列化对象有个初步的认识, 庖丁解牛,最终会被细化为readStructBegin, readFieldBegin, read<type>(readString, readI32, readI64)的有组织有序调用。
数据交换格式分类
当前的数据交换格式可以分为如下几类:
1. 自解析型
序列化的数据包含完整的结构, 包含了field名称和value值. 比如xml/json/java serizable, 大百度的mcpack/compack, 都属于此类. 即调整不同属性的顺序对序列化/反序列化不影响.
2. 半解析型
序列化的数据,丢弃了部分信息, 比如field名称, 但引入了index(常常是id+type的方式)来对应具体属性和值. 这方面的代表有google protobuf, thrift也属于此类.
3. 无解析型
传说中大百度的infpack实现, 就是借助该种方式来实现, 丢弃了很多有效信息, 性能/压缩比最好, 不过向后兼容需要开发做一定的工作, 详情不知.
thrift与常见数据交换格式的对比
交换格式 | 类型 | 优点 | 缺点 |
Xml | 文本 | 易读 | 臃肿, 不支持二进制数据类型 |
Json | 文本 | 易读 | 丢弃了类型信息, 比如"score":100, 对score类型是int/double解析有二义性, 不支持二进制数据类型 |
Java serizable | 二进制 | 使用简单 | 臃肿, 只限制在java领域 |
Thrift | 二进制 | 高效 | 不宜读, 向后兼容有一定的约定限制 |
Google Protobuf | 二进制 | 高效 | 不宜读, 向后兼容有一定的约定限制 |
向后兼容实践:Thrift官方文档, 也提到对新增的字段属性, 采用id递增的方式标识并以optional修饰来添加。
http://blog.csdn.net/zhu_tianwei/article/details/44115489
相关推荐
标题中的“Hadoop序列化机制”是指Hadoop生态系统中用于数据传输和存储的数据表示方式,它是Hadoop MapReduce和Hadoop Distributed File System (HDFS)等组件之间交换数据的关键技术。序列化是将对象转化为可存储或...
1. **Java默认序列化**:Java提供了内置的序列化机制,但存在几个显著缺点。首先,Java序列化的字节流无法被其他语言识别,限制了跨语言兼容性。其次,序列化的结果通常较大,占用较多网络带宽。最后,由于使用同步...
3. **如何实现序列化**:只需让类实现`Serializable`接口,Java的默认序列化机制就会处理剩余部分。例如: ```java public class MyObject implements Serializable { private String name; private int age; ...
- Java序列化是Java平台提供的一种持久化机制,它允许将对象转换为字节序列,这样就可以保存在文件中或在网络上传输。 - 序列化不仅可以用来持久化数据,还可以用于进程间通信(IPC)和远程方法调用(RMI)。 2. ...
1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...
实现此接口后,Java的默认序列化机制会遍历对象的所有字段并将其写入字节流。请注意,静态字段和transient关键字修饰的字段不会被序列化。 Java序列化提供了两种主要的API用于操作对象流: 1. `ObjectOutputStream...
Java序列化是Java平台内置的一种对象序列化机制,它可以将对象转换为字节流,以便在网络中传输或存储到磁盘上。Netty支持多种序列化方式,其中包括使用Java原生的序列化机制。 Java序列化是通过实现`Serializable`...
二、Thrift序列化与反序列化 1. 序列化:Thrift提供了一种高效的二进制序列化方式,将对象转换成字节流,便于在网络间传输。序列化过程包括解析数据结构,生成字节表示,并将这些字节写入到输出流。 2. 反序列化:...
1. **轻量级的序列化**:Thrift提供了一种紧凑、高效的序列化方式,相比于Java序列化,Thrift序列化后的数据量更小,传输更快。 2. **跨语言支持**:Thrift支持多种编程语言,如Java、C++、Python等,这使得不同...
6. **替代方案**:除了Java内置的序列化机制,还有许多第三方库如Google的Protocol Buffers、Facebook的Thrift、Apache Avro等,它们提供了更高效、跨语言的序列化解决方案。 通过理解和熟练掌握Java序列化和反序列...
C++并没有像Java那样的内置序列化机制,但它可以通过自定义的方式实现。 在C++中实现序列化通常涉及以下几个步骤: 1. 定义序列化接口:创建一个接口(如`ISerializable`),包含读取和写入对象状态的方法。 2. ...
Thrift提供了跨平台的运行时库,包含传输协议、序列化机制和RPC服务框架。这些库实现了服务的调度、请求处理和错误处理等功能,确保了跨语言通信的兼容性和一致性。 4. 数据序列化 Thrift支持高效的二进制序列化,...
4. 序列化/反序列化:Thrift提供了高效的二进制序列化算法,以减少网络传输的数据量。 三、Thrift的使用流程 1. 定义服务:编写IDL文件,声明服务接口和数据类型。 2. 生成代码:使用Thrift编译器将IDL文件转化为...
在.NET框架中,系统提供了一个内置的二进制序列化机制,通过`System.Runtime.Serialization.Formatters.Binary`命名空间中的`BinaryFormatter`类实现。使用这个类,我们可以轻松地将对象序列化为字节流,然后在需要...
序列化有助于跨平台通信、数据库存储、缓存机制以及网络传输等场景。 在C++中,由于其语言特性,没有内置的序列化库,但可以通过各种方式实现。一种常见的方法是自定义序列化和反序列化函数,遍历对象的所有成员并...
由于Thrift支持的序列化机制,数据在网络中传输时会被自动地序列化和反序列化,确保了不同语言之间的兼容性。 总结起来,"thrift+依赖包整合"是一个包含了Thrift核心库、源码及必需的Java依赖的集合,适用于Windows...
6. **序列化与反序列化**:Thrift提供了一种高效的二进制序列化格式,用于在客户端和服务器之间交换数据。 在`mmxf.rpc`这个压缩包中,可能包含了Thrift服务的客户端和服务端实现代码,以及相关的配置文件。解压并...
5. **序列化与反序列化**:Thrift提供了高效的序列化和反序列化机制,使得数据能在不同语言之间无缝传递。它使用二进制协议,比基于文本的JSON或XML更加紧凑和快速。 6. **多语言支持**:Thrift的一大优势在于其跨...
Kryo库以其优秀的性能在众多序列化库中脱颖而出,尤其是在处理大量对象时,它的速度比Java内置的序列化机制快得多。 Kryo的核心原理是通过反射和预注册机制来实现对象到字节流的转换。它能够深度优化序列化过程,...
Java标准库提供了一个基本的序列化机制,但是其性能并不总是最佳,特别是在处理大量数据或者需要频繁序列化和反序列化的场景下。因此,社区发展出了一些高效的替代方案,如FST、Kryo、Google的Protobuf和Facebook的...