简介
- Avro是一个数据序列化工具,用语言无关的模式定义,Avro支持二进制编码和JSON编码两种序列化方式。
使用maven插件
-
包结构
-
pom
<dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.8.2</version> </dependency> <plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>1.8.2</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>schema</goal> </goals> <configuration> <sourceDirectory>${project.basedir}/src/main/resources</sourceDirectory> <outputDirectory>${project.basedir}/src/main/java</outputDirectory> </configuration> </execution> </executions> </plugin>
-
main\resources\avro\user.avsc。该文件被叫做Schema(模式)
{ "namespace": "cn.king.entity.avro.generated", "type": "record", "name": "User", "fields": [ {"name": "name", "type": "string"}, {"name": "favorite_number", "type": ["int", "null"]}, {"name": "favorite_color", "type": ["string", "null"]} ] }
-
引入jar包和插件,编写完user.avsc后,mvn compile。执行完毕后再次观察包结构
自动生成了java类。 -
编写测试类测试序列化和反序列化。cn.king.test.avro.AvroTest
/** * @author: wjl@king.cn * @description: 序列化 * @why: */ @Test void test01() throws IOException { User user1 = User.newBuilder().setName("Tom").setFavoriteNumber(8).setFavoriteColor("blue").build(); User user2 = User.newBuilder().setName("Anna").setFavoriteNumber(6).setFavoriteColor(null).build(); User user3 = User.newBuilder().setName("Marry").setFavoriteNumber(null).setFavoriteColor("green").build(); // 序列化User对象到users.avro文件中 DatumWriter<User> userDatumWriter = new SpecificDatumWriter<>(User.class); DataFileWriter<User> dataFileWriter = new DataFileWriter<>(userDatumWriter); dataFileWriter.create(user1.getSchema(), new File("users.avro")); dataFileWriter.append(user1); dataFileWriter.append(user2); dataFileWriter.append(user3); dataFileWriter.close(); }
运行test01()
已经将三个User对象序列化到了users.avro文件中。 -
测试反序列化
/** * @author: wjl@king.cn * @description: 反序列化 * @why: */ @Test void test02() throws IOException { File file = new File("users.avro"); DatumReader<User> userDatumReader = new SpecificDatumReader<>(User.class); DataFileReader<User> dataFileReader = new DataFileReader<>(file, userDatumReader); User user = null; while (dataFileReader.hasNext()) { user = dataFileReader.next(user); System.out.println(user); } }
运行test02()后控制台输出以下内容:
{"name": "Tom", "favorite_number": 8, "favorite_color": "blue"} {"name": "Anna", "favorite_number": 6, "favorite_color": null} {"name": "Marry", "favorite_number": null, "favorite_color": "green"}
不使用maven插件
-
任意文件夹编写好Schema并下载好avro-tools-1.8.2.jar
-
运行jar包:
java -jar avro-tools-1.8.2.jar compile schema D:\tmp\user.avsc .
运行完毕后可见已经在我们指定的目录生成了Schema中定义好的Java类。将Java类放入项目中。
-
当前包结构
-
pom只需要添加一个avro
<dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.8.2</version> </dependency>
-
序列化和反序列化方式同test01()、test02()。
使用Avro序列化对象到本地文件
/**
* @author: wjl@king.cn
* @description: 序列化
* @why:
*/
@Test
void test01() throws IOException {
User user1 = User.newBuilder().setName("Tom").setFavoriteNumber(8).setFavoriteColor("blue").build();
User user2 = User.newBuilder().setName("Anna").setFavoriteNumber(6).setFavoriteColor(null).build();
User user3 = User.newBuilder().setName("Marry").setFavoriteNumber(null).setFavoriteColor("green").build();
// 序列化User对象到users.avro文件中
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<>(userDatumWriter);
dataFileWriter.create(user1.getSchema(), new File("users.avro"));
dataFileWriter.append(user1);
dataFileWriter.append(user2);
dataFileWriter.append(user3);
dataFileWriter.close();
}
/**
* @author: wjl@king.cn
* @description: 反序列化
* @why:
*/
@Test
public void test02() throws IOException {
File file = new File("users.avro");
DatumReader<User> userDatumReader = new SpecificDatumReader<>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<>(file, userDatumReader);
User user = null;
while (dataFileReader.hasNext()) {
user = dataFileReader.next(user);
System.out.println(user);
}
}