环境:
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.2步中,pom文件中配置了插件,所以在maven项目中,我们只需要执行mvn complie 命令就可以自动生成java文件了。
注:插件会自动搜索src/main/avro目录下的.avsc结尾的文件,并生成java文件到src/main/java包下
因为我们在pom文件中指定了相应目录:
如果使用Intellij,我们直接执行compile即可:
执行之后会在相应目录生成User.java文件