Intellij 15.0.3
Maven
avro 1.8.0

Avro是一个数据序列化系统。
它提供以下:
1 丰富的数据结构类型
2 快速可压缩的二进制数据形式
3 存储持久数据的文件容器
4 远程过程调用RPC
5 简单的动态语言结合功能,Avro和动态语言结合后,读写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。
Avro依赖于模式(Schema)。Avro数据的读写操作是很频繁的,而这些操作都需要使用模式,这样就减少写入每个数据资料的开销,使得序列化快速而又轻巧。这种数据及其模式的自我描述方便于动态脚本语言的使用。

下面介绍如果使用avro进行序列化和反序列化的操作
前置条件:
maven项目

1、在pom.xml中添加avro的依赖包和编译插件

1.1 配置avro依赖

在dependencies中配置avro的GAV

<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.8.0</version>
</dependency>

1.2 在build–>plugins下配置编译插件

<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.8.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>

2、定义avro的scheme

Avro scheme是通过JSON形式来定义的,一般以.avsc结尾(maven插件会去指定目录下获取.avsc结尾的文件并生成成Java文件)

2.1 在src/main目录下新建一个avro文件夹

2.2 在src/main/avro目录下新建一个文件,并保存为user.avsc。文件内容如下:

{"namespace": "cn.md31.avro.test.bean",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["int", "null"]},
{"name": "favorite_color", "type": ["string", "null"]}
]
}

其中
namespace在java项目中翻译成包名
name是类名
fields就是配置的属性
注意:必须配置type为record

2.3 生成User的java文件

avro提供了一个avro-tools包来生成java文件,可以通过下面命令:

java -jar /path/to/avro-tools-1.8.0.jar compile schema <schema file> <destination>
  • 1
  • 1

在1.2步中,pom文件中配置了插件,所以在maven项目中,我们只需要执行mvn complie 命令就可以自动生成java文件了。
注:插件会自动搜索src/main/avro目录下的.avsc结尾的文件,并生成java文件到src/main/java包下
因为我们在pom文件中指定了相应目录:

如果使用Intellij,我们直接执行compile即可:

执行之后会在相应目录生成User.java文件

1 使用生成的User类初始化User对象

Avro自动生成的User类有三种方式初始化:

1.1 使用构造方法:

User user1 = new User("user1", 10, "red");

1.2 使用setter方法

User user2 = new User();
user2.setName("user2");
user2.setFavoriteNumber(11);
user2.setFavoriteColor("white");
  • 1
  • 2

1.3 使用build方法

User user3 = User.newBuilder()
.setName("user3")
.setFavoriteNumber(12)
.setFavoriteColor("black")
.build();

整合到produceUsers方法中:

public static List<User> produceUsers() {
List<User> userList = new ArrayList<User>();
// 三种初始化方式
User user1 = new User("user1", 10, "red");
User user2 = new User();
user2.setName("user2");
user2.setFavoriteNumber(11);
user2.setFavoriteColor("white");
User user3 = User.newBuilder()
.setName("user3")
.setFavoriteNumber(12)
.setFavoriteColor("black")
.build();
userList.add(user1);
userList.add(user2);
userList.add(user3);
return userList;
}

2 把User对象序列化到文件中

public static void serializeAvroToFile(List<User> userList, String fileName) throws IOException {
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
dataFileWriter.create(userList.get(0).getSchema(), new File(fileName));
for (User user: userList) {
dataFileWriter.append(user);
}
dataFileWriter.close();
}

在main方法中调用上面两个方法

public static void main(String[] args) throws IOException {
List<User> userList = produceUsers();
String fileName = "users.avro";
serializeAvroToFile(userList, fileName);
// deserializeAvroFromFile(fileName);
//
// byte[] usersByteArray = serializeAvroToByteArray(userList);
// deserialzeAvroFromByteArray(usersByteArray);
}

执行main方法,会发现在根目录生成了一个users.avro文件:

3 从文件中反序列化对象

public static void deserializeAvroFromFile(String fileName) throws IOException {
File file = new File(fileName);
DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
User user = null;
System.out.println("----------------deserializeAvroFromFile-------------------");
while (dataFileReader.hasNext()) {
user = dataFileReader.next(user);
System.out.println(user);
}
}

执行之后得到结果:

4、序列化对象成byte 数组

public static byte[] serializeAvroToByteArray(List<User> userList) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
dataFileWriter.create(userList.get(0).getSchema(), baos);
for (User user: userList) {
dataFileWriter.append(user);
}
dataFileWriter.close();
return baos.toByteArray();
}

5、从byte数组中反序列化成对象

public static void deserialzeAvroFromByteArray(byte[] usersByteArray) throws IOException {
SeekableByteArrayInput sbai = new SeekableByteArrayInput(usersByteArray);
DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(sbai, userDatumReader);
System.out.println("----------------deserialzeAvroFromByteArray-------------------");
User readUser = null;
while (dataFileReader.hasNext()) {
readUser = dataFileReader.next(readUser);
System.out.println(readUser);
}
}

avro序列化详细操作的更多相关文章

  1. (47) odoo详细操作手册

    odoo 8 详细操作手册, ERP(Odoo8.0)操作手册-v1.10(陈伟明).pdf 链接: http://pan.baidu.com/s/1hsp0bVQ 密码: r9tt 花了将近9个月时 ...

  2. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  3. yii2权限控制rbac之详细操作步骤

    本篇的主题是 rbac权限控制的详细操作步骤,注意是操作步骤哦,关于配置与rbac的搭建,我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程说的再清楚不过了. 但是,在很多人的反馈下,说是 ...

  4. UiAutomator环境搭建及详细操作

    一.环境搭建 1.1 必备条件 JDK SDK(API高于15) Eclipse(安装ADT插件) ANT(用于编译生成的jar) 安装JDK并添加环境变量 1.2 详细步骤 1.安装JDK并添加环境 ...

  5. day42 字段的增删改查详细操作

    复习 # 1.表的详细操作 create table nt like ot; # 只复制表的结构包括约束 create table nt select * from ot where 1=2; # 复 ...

  6. day41 mysql详细操作

    复习 create table 表名( id int primary key auto_increment, 字段名 数据类型[(宽度) 约束] )engine=innodb charset=utf8 ...

  7. MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理

    MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...

  8. {MySQL的库、表的详细操作}一 库操作 二 表操作 三 行操作

    MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf ...

  9. iOS数据库操作之coredata详细操作步骤

    CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/ ...

随机推荐

  1. PL/SQL 09 包 package

    --定义包头 create or replace package 包名as  变量.常量声明;  函数声明;  过程声明;end; --定义包体 create or replace package b ...

  2. <context-param>与<init-param>的区别与作用(转自青春乐园)(

    <context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件we ...

  3. [BZOJ4568][Scoi2016]幸运数字 倍增+线性基

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1791  Solved: 685[Submit][Statu ...

  4. AC日记——Rmq Problem bzoj 3339

    3339 思路: 恶心: 代码: #include <cstdio> #include <cstring> #include <iostream> #include ...

  5. 浙江省第十二届省赛 B - Team Formation

    Description For an upcoming programming contest, Edward, the headmaster of Marjar University, is for ...

  6. Asp.net中web.config配置文件详解

    Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中 ...

  7. centos6.5 中文输入法图标和提示都不见了【解决】

    原因python升级引起的 两步解决: # vi /usr/bin/ibus-setup # vi /usr/libexec/ibus-ui-gtk 把这两个文件中的exec python 修改为 e ...

  8. RQNOJ PID379 / 约会计划 -并查集

    PID379 / 约会计划 题目描述 cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的调解各各妹妹间的关系.mm之间 ...

  9. HDU 1556 Color the ball【差分数组裸题/模板】

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...

  10. 51nod 1240 莫比乌斯函数【数论+莫比乌斯函数】

    1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用 ...