Apache Avro 序列化与反序列化 (Java 实现)

转载 2018年04月15日 18:24:43

像两个人交流一样要找一个互相能理解的语言, 在国内为普通话, 跑国外多用英语相通, 两个进程间通信也需要找一个大家都能理解的数据格式. 简单的如 JSON, XML, 那是自我描述性格式, XML 有 Schema 定义, 但尚无正式的 JSON Schema 规范. 在讲求效率的场合, 纯文本式的数据交换格式无法满足要求, 于是有二进制的 Google Protobuf 和 Apache Avro. 在 Apache 的生态像 Hadoop, Kafka 中自然是选用 Avro.

Avro 支持多种语言, 如 C, C++, C#, Java, PHP, Python 和 Ruby. 它使用 JSON 来定义 Schema, 通过工具可以由 Schema 生成相应语言的数据对象, 比如 Java 的  avro-tools.jar. 这样可以在跨进程跨语言透明的实现为对象交换.

本文体验 Java 环境中 Avro 数据格式的序列化与反序列化.

Avro Schema 文件就是数据生产和消费端的通信协议; 我们可以由 Schema 生成相应的 Java 对象, 然后以具体的 Java 对象交换, 或者不生成 Java 对象而纯粹以 GenericRecord 交互. 为操作数据的简单, 我们通常采用前一种方式, 即生成具体数据传输对象.

首先定义一个 Schema

对于 Schema 不多加说明, 这里只定义了一个 User 对象, 有两个属性 name 和  address. Schema 的详细解释可打开 http://avro.apache.org/docs/1.8.1/spec.html.

假设文件名为 user.avscavsc 应该是 Avro Schema 文件, 我至今都未查到 Avro 是什么的缩写.

由 Schema 生成 Java 对象

我们需要用到 avro-tools-1.x.x.jar 工具包, 当前版本是 1.8.1, 命令格式是

java -jar /path/to/avro-tools-1.8.1.jar compile schema user.avsc .

上面命令会在当前目录生成 cc/unmi/data/User.java 文件. 下面的例子会使用 org.apache.avro:avro-maven-plugin 来从 Schema 生成 Java 对象.

可以大致看一下生成的 User.java 的片断

生成的对象中包含完整的 Schema 定义内容, 可由静态方法 getClassSchema() 和实例方法 getSchema() 获得相应的 Schema, 所以拥有了这个对象类通信时就不再需要 user.avsc 文件了. 在它的父类 SpecificRecordBase 类中定义了抽象方法 getSchema().

并且这个类提供了多种方式来创建一个实例

  1. User user = new User(); user.setName("Yanbin")..., user.put(2, "Chicago")..., user.put("name", "Qiu")
  2. User user = new User("Yanbin", "Chicago")
  3. User user = User.newBuilder().setName("Yanbin").setAddress("Chicago").build()

序列化

下面的代码把一个 User 对象序列化为字节数组, 也可以序列化为外部文件

光有序列化代码无法验证序列化后的数据是否正确, 于是要有下面的反序列化代码

反序列化

从上面方法输出的字节数组中反序列化出相等的对象来,  userDatumReader.read(new User(), binaryEncoder) 执行后的返回值与被更新后的第一个参数是一样的, 所以这个方法要是能写成 reutnr userDatumReader.read(User.class, binaryEncoder); 会好看些.

有了上面的两个方法需要串联起来, 序列化的输出作为反序化的输出就能能证明两个操作是否正确

验证序列化与反序列化

执行输出结果如下

Same object? false
Objects equal? true
All fields: {"name": "Yanbin", "address": "Chicago"}

准确无误, 大功告成

本例实作是一个 Maven  项目, pom.xml 文件内容如下:

由 user.avsc 生成 Java 对象是挂在 generate-sources 阶段执行的, 所以在 mvn compile 时会生成 User.java 文件.

完整的项目文件在 GitHub 上 https://github.com/yabqiu/apache-avro-demo.

相关链接:

  1. Apache Avro™ 1.8.1 Getting Started (Java)
  2. Avro序列化方法
  3. Apache Avro使用入指南

计算机软件专业技术资格和水平考试备考要略(下)

◆ 高级程序员   高级程序员级上下午各2个半小时。上午试卷有15道必做题,内容包括:数据结构(如树和图的定义、存储和操作),程序语言及编译知识,操作系统理论知识(如进程、资源管理方法),软件工程基础...
  • xingjiaren
  • xingjiaren
  • 2001-04-13 17:20:00
  • 696

hadoop深入研究:(十六)——Avro序列化与反序列化

转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/9664233所有源码在github上,https://github.com/la...
  • lastsweetop
  • lastsweetop
  • 2013-08-06 15:33:31
  • 20624

Avro序列化操作(2):序列化和反序列化

上一节介绍了avro的基本环境搭建和schema操作,本节介绍如果把对象序列化到文件中,并且从文件中反序列化成相应对象1 使用生成的User类初始化User对象Avro自动生成的User类有三种方式初...
  • hua245942641
  • hua245942641
  • 2016-02-23 16:51:07
  • 2188

Avro - 简单介绍,Java版 - 序列化与反序列化官方例子

Avro - 简单介绍,Java版 - 序列化与反序列化官方例子 英文原文http://avro.apache.org/docs/1.7.7/gettingstartedjava.htmlHenvea...
  • u013054888
  • u013054888
  • 2017-03-21 17:29:40
  • 938

java jackson avro kryo等几种序列化与反序列化工具的使用

最近由于工作需要,需要研究常用的集中序列化方式,主要目的是对象序列化后占用空间会大大减少,便于存储和传输,下面是几种序列化方式的使用demo   1. Java自带的Serialize 依赖ja...
  • u013597009
  • u013597009
  • 2017-11-15 10:34:28
  • 517

Avro序列化/反序列化

原文: http://avro.apache.org/docs/current/gettingstartedjava.html This is a short guide for getting ...
  • sundongsdu
  • sundongsdu
  • 2015-07-21 12:44:58
  • 1456

如何用Avro在内存中实现序列化 和反序列化

最近项目中要用Avro对发送到Kafka中的数据进行序列化, 用Avro进行序列化可以有两种方式: 一种是在内存中序列化,另一种是数据文件格式。 改怎么选择呢? 如果想把Avro集成到现有系统,用...
  • zhanglc_5168
  • zhanglc_5168
  • 2015-02-02 16:36:34
  • 1157

Kafka生产者消费者java示例(包含Avro序列化)

文章内容包含Kafka未进行序列化生产消费java示例,和使用Avro序列化数据进行生产和消费的示例,掌握这些之后就对Kafka的生产消费有基本开发基础。 1.未序列化 生产者示例: i...
  • a822631129
  • a822631129
  • 2015-12-28 13:57:30
  • 6559

Kafka消息序列化和反序列化(下)

接上一篇:Kafka消息序列化和反序列化(上)。 有序列化就会有反序列化,反序列化的操作是在Kafka Consumer中完成的,使用起来只需要配置一下key.deserializer和value....
  • u013256816
  • u013256816
  • 2017-11-28 18:39:35
  • 1399

【Hadoop】数据序列化系统Avro

Avro简介 schema 文件组成 声明代码 测试代码 序列化与反序列化 specific generic 参考文献Avro简介Avro是由Doug Cutting(Hadoop之父)创建的数据序列...
  • lifehack
  • lifehack
  • 2015-08-31 08:47:00
  • 2350
收藏助手
不良信息举报
您举报文章:Apache Avro 序列化与反序列化 (Java 实现)
举报原因:
原因补充:

(最多只允许输入30个字)