上一节介绍了avro的基本环境搭建和schema操作,本节介绍如果把对象序列化到文件中,并且从文件中反序列化成相应对象
1 使用生成的User类初始化User对象
Avro自动生成的User类有三种方式初始化:
1.1 使用构造方法:
User user1 = new User("user1", 10, "red");
1.2 使用setter方法
User user2 = new User();
user2.setName("user2");
user2.setFavoriteNumber(11);
user2.setFavoriteColor("white");
1.3 使用build方法
User user3 = User.newBuilder()
.setName("user3")
.setFavoriteNumber(12)
.setFavoriteColor("black")
.build();
整合到produceUsers方法中:
public static List<User> produceUsers() {
List<User> userList = new ArrayList<User>();
// 三种初始化方式
User user1 = new User("user1", 10, "red");
User user2 = new User();
user2.setName("user2");
user2.setFavoriteNumber(11);
user2.setFavoriteColor("white");
User user3 = User.newBuilder()
.setName("user3")
.setFavoriteNumber(12)
.setFavoriteColor("black")
.build();
userList.add(user1);
userList.add(user2);
userList.add(user3);
return userList;
}
2 把User对象序列化到文件中
public static void serializeAvroToFile(List<User> userList, String fileName) throws IOException {
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
dataFileWriter.create(userList.get(0).getSchema(), new File(fileName));
for (User user: userList) {
dataFileWriter.append(user);
}
dataFileWriter.close();
}
在main方法中调用上面两个方法
public static void main(String[] args) throws IOException {
List<User> userList = produceUsers();
String fileName = "users.avro";
serializeAvroToFile(userList, fileName);
// deserializeAvroFromFile(fileName);
//
// byte[] usersByteArray = serializeAvroToByteArray(userList);
// deserialzeAvroFromByteArray(usersByteArray);
}
执行main方法,会发现在根目录生成了一个users.avro文件:
3 从文件中反序列化对象
public static void deserializeAvroFromFile(String fileName) throws IOException {
File file = new File(fileName);
DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
User user = null;
System.out.println("----------------deserializeAvroFromFile-------------------");
while (dataFileReader.hasNext()) {
user = dataFileReader.next(user);
System.out.println(user);
}
}
执行之后得到结果:
4、序列化对象成byte 数组
public static byte[] serializeAvroToByteArray(List<User> userList) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
dataFileWriter.create(userList.get(0).getSchema(), baos);
for (User user: userList) {
dataFileWriter.append(user);
}
dataFileWriter.close();
return baos.toByteArray();
}
5、从byte数组中反序列化成对象
public static void deserialzeAvroFromByteArray(byte[] usersByteArray) throws IOException {
SeekableByteArrayInput sbai = new SeekableByteArrayInput(usersByteArray);
DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(sbai, userDatumReader);
System.out.println("----------------deserialzeAvroFromByteArray-------------------");
User readUser = null;
while (dataFileReader.hasNext()) {
readUser = dataFileReader.next(readUser);
System.out.println(readUser);
}
}