JAVA—其他—Avro序列化

Avro是hadoop的一个用于序列化的组件

理解特点:

  1. 高效
  2. 序列化后体积小
  3. 动态 动态指的是数据的结构一旦定义,可以在多处语言生成实体类

引用jar包

<properties>

        <maven.compiler.source>8</maven.compiler.source>

        <avro.version>1.10.2</avro.version>

    </properties>



    <dependencies>

        <dependency>

            <groupId>org.apache.avro</groupId>

            <artifactId>avro</artifactId>

            <version>${avro.version}</version>

        </dependency>

    </dependencies>

引用maven插件(如不生成代码可不必引用)

<!-- avro-maven-plugin -->

            <plugin>

                <groupId>org.apache.avro</groupId>

                <artifactId>avro-maven-plugin</artifactId>

                <version>${avro.version}</version>

                <executions>

                    <execution>

                        <phase>generate-sources</phase>

                        <goals>

                            <goal>schema</goal>

                        </goals>

                        <configuration>

                            <sourceDirectory>${project.basedir}/src/main/resources/avro/</sourceDirectory>

                            <outputDirectory>${project.build.directory}/generated/avro</outputDirectory>

                        </configuration>

                    </execution>

                </executions>

            </plugin>

插件中需要配置

  1. sourceDirectory: avro文件的目录,此处的avro文件也就是定义好的数据结构
  2. outputDirectory: 插件生成的实体存放的目录


1.快速使用


package com.zy.learn;


import com.zy.learn.avro.User;

import org.apache.avro.file.DataFileReader;

import org.apache.avro.file.DataFileWriter;

import org.apache.avro.generic.GenericDatumReader;

import org.apache.avro.generic.GenericRecord;

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 java.io.File;

import java.io.IOException;


/**

 * @Author: Zy

 * @Date: 2021/10/26 9:30

 * avro测试类

 */

public class AvroTest {

    /**

     * 测试序列化

     *

     * @author Zy

     * @date 2021/10/26

     */

    public static void testSerializing() throws IOException {

        User user1 = User.newBuilder()

                .setName("zy")

                .setFavoriteNumber(10)

                .setFavoriteColor("hhh")

                .build();


        DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);

        DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);

        dataFileWriter.create(user1.getSchema(), new File("users.avro"));

        dataFileWriter.append(user1);

        dataFileWriter.close();

    }


    /**

     * 反序列化

     * @author Zy

     * @date 2021/10/28

     */

    public static void testDeserializing() throws IOException {

        GenericDatumReader<GenericRecord> userDatumReader = new GenericDatumReader<>();

        DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("users.avro"), userDatumReader);

        GenericRecord user = null;

        while (dataFileReader.hasNext()) {

            user = dataFileReader.next(user);

            System.out.println(user);

        }

    }


    public static void main(String[] args) throws IOException {

//        testSerializing();

        testDeserializing();

    }

}


说明:

avro序列化如果使用代码生成,生成了实体后就直接使用实体作为泛型序列化和反序列化即可 类似上文例子中的测试序列化中的写法

如果没有使用代码生成,则没有实体类,此时avro提供了一个公共的类可以作为泛型,GenericRecord

上一篇:C/C++中字符串切割(split)


下一篇:12 个 jQuery 的表单验证教程和插件