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"}

图:

AVRO的系列化和反序列化(建造者模式)

AVRO的系列化和反序列化(建造者模式)

AVRO的系列化和反序列化(建造者模式)

AVRO的系列化和反序列化(建造者模式)