Apache Avro:简单的序列化和反序列化操作的Demo
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Avro:简单的序列化和反序列化操作的Demo相关的知识,希望对你有一定的参考价值。
1. 声明
当前内容主要为本人学习和使用Apache Avro这个序列化库,主要参考官方文档
主要操作为:
- 手动编译schame为java文件
- 将生产的类进行序列化和反序列化操作
基本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的主要内容,如果未能解决你的问题,请参考以下文章
Apache Avro 序列化与反序列化 (Java 实现)