AVRO的系列化和反序列化(建造者模式)
package cn.tedu.pojo; 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 org.junit.Test; import java.io.File; import java.io.IOException; public class AVRODemo { @Test public void createUser() { User u1 = new User(); u1.setUsername("Helen"); u1.setAge(19); u1.setGender("male"); System.out.println(u1); User u2 = new User("Lucy", 18, "male"); System.out.println(u2); // 建造者模式 User u3 = User.newBuilder(u2).setUsername("Lily").build(); System.out.println(u3); } // 序列化 @Test public void serial() throws IOException { User u1 = new User("Amy", 15, "female"); User u2 = new User("Sam", 16, "male"); User u3 = new User("Bob", 17, "male"); // 获取序列化流 DatumWriter<User> dw = new SpecificDatumWriter<>(User.class); // 获取文件流 DataFileWriter<User> dfw = new DataFileWriter<>(dw); // 指定写出的文件 dfw.create(User.SCHEMA$, new File("D:\\a.txt")); // 写出对象 dfw.append(u1); dfw.append(u2); dfw.append(u3); // 关流 dfw.close(); } // 反序列化 @Test public void deserial() throws IOException { // 获取反序列化流 DatumReader<User> dr = new SpecificDatumReader<>(User.class); // 获取文件流 DataFileReader<User> dfr = new DataFileReader<>( new File("D:\\a.txt"), dr); // AVRO将这个文件流设计成了一个迭代器模式 // 所以可以利用迭代器模式来遍历对象 while (dfr.hasNext()) { User u = dfr.next(); System.out.println(u); } // 关流 dfr.close(); } }
测试输出:
{"username": "Amy", "age": 15, "gender": "female"}
{"username": "Sam", "age": 16, "gender": "male"}
{"username": "Bob", "age": 17, "gender": "male"}
图: