Avro序列化操作(2):序列化和反序列化

来源:互联网 发布:slack软件 编辑:程序博客网 时间:2024/04/16 22:12

上一节介绍了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);        }    }

完整的avro-test项目,点我下载

1 0