JAVA—其他—Avro序列化

简介: Avro是hadoop的一个用于序列化的组件理解特点:1. 高效2. 序列化后体积小3. 动态 动态指的是数据的结构一旦定义,可以在多处语言生成实体类

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

目录
相关文章
|
18天前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
10天前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
18天前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
5天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
8 0
|
1月前
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
33 7
|
2月前
|
存储 安全 Java
day24:Java零基础 - 序列化与反序列化
【7月更文挑战第24天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 1
|
2月前
|
存储 安全 Java
day23:Java零基础 - 反序列化
【7月更文挑战第23天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 2
|
2月前
|
存储 安全 Java
day22:Java零基础 - 序列化
【7月更文挑战第22天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
28 3
|
2月前
|
自然语言处理 安全 Java
Java演进问题之Substrate VM处理Java序列化如何解决
Java演进问题之Substrate VM处理Java序列化如何解决
|
2月前
|
分布式计算 Java 数据库
Java中的序列化与反序列化详解
Java中的序列化与反序列化详解
下一篇
DDNS