主要参考:
上一篇文章说的是如何通过.avsc的schema文件生成对应的java类。现在我们要研究的是avro的序列化和反序列化。
序列化:
package com.xueyou.avro.demo;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumWriter;
import java.io.File;
public class App {
public static void main(String[] args) throws Exception {
System.out.println("Hello World!");
User user = User.newBuilder().setName("xiaoming")
.setFavoriteNumber(12)
.setFavoriteColor("blue")
.build();
User user2 = User.newBuilder().setName("xiaogang")
.setFavoriteColor(null)
.setFavoriteNumber(null)
.build();
System.out.println(user);
System.out.println(user2);
File file = new File("users.avro");
DatumWriter<User> datumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(datumWriter);
dataFileWriter.create(user.getSchema(), file);
dataFileWriter.append(user);
dataFileWriter.append(user2);
dataFileWriter.close();
}
}
反序列化:
package com.xueyou.avro.demo;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.io.DatumReader;
import org.apache.avro.specific.SpecificDatumReader;
import java.io.File;
public class App2 {
public static void main(String[] args) throws Exception {
File file = new File("users.avro");
DatumReader<User> datumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(file, datumReader);
User user = null;
while (dataFileReader.hasNext()) {
user = dataFileReader.next(user);
System.out.println(user);
}
}
}
运行结果: