Apache Avro:简单的序列化和反序列化操作的Demo

Posted 你是小KS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Avro:简单的序列化和反序列化操作的Demo相关的知识,希望对你有一定的参考价值。

1. 声明

当前内容主要为本人学习和使用Apache Avro这个序列化库,主要参考官方文档
主要操作为:

  1. 手动编译schame为java文件
  2. 将生产的类进行序列化和反序列化操作

基本pom依赖

<dependency>
	<groupId>org.apache.avro</groupId>
	<artifactId>avro</artifactId>
	<version>1.10.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.avro/avro-tools -->
<dependency>
	<groupId>org.apache.avro</groupId>
	<artifactId>avro-tools</artifactId>
	<version>1.10.2</version>
</dependency>

2. 创建schame并生成Java文件

1.编写User.schame文件

{"namespace": "com.hy.apache.avro.pojo",
 "type": "record",
 "name": "User",
 "fields": [
     {"name": "name", "type": "string"},
     {"name": "age",  "type": ["int", "null"]},
     {"name": "address", "type": ["string", "null"]}
 ]
}

其中json文件中
namespace相当于java中的包名称,type表示类型为class,name表示类名称,fields表示这个类中具有的属性,type就是类型

2.生成java文件

将avro-tools-1.10.2.jar复制到user.schame的位置并执行:(官方的avro-maven-plugin不生效)

java -jar avro-tools-1.10.2.jar compile schema user.schame D:\\eclipseworkspace\\Apache-Kafka-Start\\src\\main\\java\\

注意使用complie schame schame的文件 输出路径,小心其中的空格

执行结果为:
在这里插入图片描述
在这里插入图片描述

此时生成的实体类就成功了

3. 执行序列化和反序列化操作的demo

import java.io.File;
import java.io.IOException;

import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;

import com.hy.apache.avro.pojo.User;

/**
 * 
 * @author hy
 * @createTime 2021-06-13 13:57:59
 * @description 当前内容主要为测试和使用Apache Avro这个序列化和反序列化库
 *
 */
public class ApacheAvroTest {
	public static void main(String[] args) throws IOException {
		// 创建一个User对象并执行序列化写入到文件的操作
		User user = new User("张三", 18, "张家湾");
		File file = new File("users.avro");
		DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
		DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
		dataFileWriter.create(user.getSchema(), file);
		dataFileWriter.append(user);
		// 官方文档中可以有多个append,写入多个对象
		dataFileWriter.close();
		System.out.println("写入当前的对象User成功....");
		
		// 开始使用avro来读取当前的文件

		// 从磁盘上解序列化为对象
		DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
		DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
		User readUser = null;
		while (dataFileReader.hasNext()) {
			readUser = dataFileReader.next(readUser);
			System.out.println(readUser);
		}
		dataFileReader.close();

	}
}

执行的结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
测试成功

以上是关于Apache Avro:简单的序列化和反序列化操作的Demo的主要内容,如果未能解决你的问题,请参考以下文章

Avro 与 Protobuf 的性能指标

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

使用 Apache Beam 反序列化 Kafka AVRO 消息

节Avro序列化的使用

avro序列化详细操作

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