Avro序列化与反序列化

简介

  • Avro是一个数据序列化工具,用语言无关的模式定义,Avro支持二进制编码和JSON编码两种序列化方式。

使用maven插件

  • 包结构
    在这里插入图片描述

  • pom

    <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro</artifactId>
        <version>1.8.2</version>
    </dependency>
    
    <plugin>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-maven-plugin</artifactId>
        <version>1.8.2</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>schema</goal>
                </goals>
                <configuration>
                    <sourceDirectory>${project.basedir}/src/main/resources</sourceDirectory>
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  • main\resources\avro\user.avsc。该文件被叫做Schema(模式)

    {
        "namespace": "cn.king.entity.avro.generated",
        "type": "record",
        "name": "User",
        "fields": [
            {"name": "name", "type": "string"},
            {"name": "favorite_number", "type": ["int", "null"]},
            {"name": "favorite_color", "type": ["string", "null"]}
        ]
    }
    
  • 引入jar包和插件,编写完user.avsc后,mvn compile。执行完毕后再次观察包结构
    在这里插入图片描述
    自动生成了java类。

  • 编写测试类测试序列化和反序列化。cn.king.test.avro.AvroTest

    /**
     * @author: wjl@king.cn
     * @description: 序列化
     * @why:
     */
    @Test
    void test01() throws IOException {
        User user1 = User.newBuilder().setName("Tom").setFavoriteNumber(8).setFavoriteColor("blue").build();
        User user2 = User.newBuilder().setName("Anna").setFavoriteNumber(6).setFavoriteColor(null).build();
        User user3 = User.newBuilder().setName("Marry").setFavoriteNumber(null).setFavoriteColor("green").build();
    
        // 序列化User对象到users.avro文件中
        DatumWriter<User> userDatumWriter = new SpecificDatumWriter<>(User.class);
        DataFileWriter<User> dataFileWriter = new DataFileWriter<>(userDatumWriter);
        dataFileWriter.create(user1.getSchema(), new File("users.avro"));
        dataFileWriter.append(user1);
        dataFileWriter.append(user2);
        dataFileWriter.append(user3);
        dataFileWriter.close();
    }
    

    运行test01()
    在这里插入图片描述
    已经将三个User对象序列化到了users.avro文件中。

  • 测试反序列化

    /**
     * @author: wjl@king.cn
     * @description: 反序列化
     * @why:
     */
    @Test
    void test02() throws IOException {
        File file = new File("users.avro");
        DatumReader<User> userDatumReader = new SpecificDatumReader<>(User.class);
        DataFileReader<User> dataFileReader = new DataFileReader<>(file, userDatumReader);
        User user = null;
        while (dataFileReader.hasNext()) {
            user = dataFileReader.next(user);
            System.out.println(user);
        }
    }
    

    运行test02()后控制台输出以下内容:

    {"name": "Tom", "favorite_number": 8, "favorite_color": "blue"}
    {"name": "Anna", "favorite_number": 6, "favorite_color": null}
    {"name": "Marry", "favorite_number": null, "favorite_color": "green"}
    

不使用maven插件

  • 任意文件夹编写好Schema并下载好avro-tools-1.8.2.jar
    在这里插入图片描述

  • 运行jar包:java -jar avro-tools-1.8.2.jar compile schema D:\tmp\user.avsc .
    在这里插入图片描述

    运行完毕后可见已经在我们指定的目录生成了Schema中定义好的Java类。将Java类放入项目中。

  • 当前包结构
    在这里插入图片描述

  • pom只需要添加一个avro

    <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro</artifactId>
        <version>1.8.2</version>
    </dependency>
    
  • 序列化和反序列化方式同test01()、test02()。


使用Avro序列化对象到本地文件

   /**
    * @author: wjl@king.cn
    * @description: 序列化
    * @why:
    */
   @Test
    void test01() throws IOException {
       User user1 = User.newBuilder().setName("Tom").setFavoriteNumber(8).setFavoriteColor("blue").build();
       User user2 = User.newBuilder().setName("Anna").setFavoriteNumber(6).setFavoriteColor(null).build();
       User user3 = User.newBuilder().setName("Marry").setFavoriteNumber(null).setFavoriteColor("green").build();
       // 序列化User对象到users.avro文件中
       DatumWriter<User> userDatumWriter = new SpecificDatumWriter<>(User.class);
       DataFileWriter<User> dataFileWriter = new DataFileWriter<>(userDatumWriter);
       dataFileWriter.create(user1.getSchema(), new File("users.avro"));
       dataFileWriter.append(user1);
       dataFileWriter.append(user2);
       dataFileWriter.append(user3);
       dataFileWriter.close();
   }
   /**
    * @author: wjl@king.cn
    * @description: 反序列化
    * @why:
    */
   @Test
   public void test02() throws IOException {
       File file = new File("users.avro");
       DatumReader<User> userDatumReader = new SpecificDatumReader<>(User.class);
       DataFileReader<User> dataFileReader = new DataFileReader<>(file, userDatumReader);
       User user = null;
       while (dataFileReader.hasNext()) {
           user = dataFileReader.next(user);
           System.out.println(user);
       }
   }

Java读取CSV文件内容导入Kafka,使用Avro序列化

Java消费Kafka数据,使用Avro反序列化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值