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

上一节介绍了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项目,点我下载

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值