前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Avro「建议收藏」

Avro「建议收藏」

作者头像
全栈程序员站长
发布2022-11-01 16:10:21
7730
发布2022-11-01 16:10:21
举报
文章被收录于专栏:全栈程序员必看
序列化/反序列化机制

将对象转化为字节来进行存储称之为序列化;将字节还原会对象的过程称之为反序列化

java中的序列化反序列化机制:需要利用原生流来实现,Serializable(该对象可以进行序列化/反序列化),static/transient(被修饰之后不能序列化/反序列化),serialVersionUID(版本号,如果版本号对上了再进行序列化/反序列,如果对不上,不进行序列化/反序列化) 原生机制缺点:

  1. 效率低
  2. 占用空间比较大:将类以及对象中的信息全部输出
  3. 兼容性较差:只能支持java使用

Avro-大数据通用的序列化器

简介

Apache Avro(以下简称 Avro)是一种与编程语言无关的序列化格式。Doug Cutting 创建了这个项目,目的是提供一种共享数据文件的方式。

Avro 数据通过与语言无关的 schema 来定义。schema 通过 JSON 来描述,数据被序列化成二进制文件或 JSON 文件,不过一般会使用二进制文件。Avro 在读写文件时需要用到 schema,schema 一般会被内嵌在数据文件里。

是Apache的开源项目。(天然支持Hadoop) 利用固定格式的文件(.avsc)来实现不同平台之间的解析操作。

Avro支持类型

Avro简单格式列表(8种)

原生类型

说明

null

表示没有值

boolean

表示一个二级制布尔值

int

表示32位有符号整数

long

表示64位有符号整数

float

表示32位单精度浮点数

double

表示64位双精度浮点数

bytes

表示8位无符号字节序列

string

表示字符序列

Avro复杂格式列表(6种)

复杂类型

属性

说明

Records

type name

record

name(必有属性)

a JSON string

type (必有属性)

a schema/a string of defined record

fields(必有属性)

a JSON array, listing fields (required)

namespace

a JSON string that qualifies the name(optional)

doc

a JSON string providing documentation to the user of this schema (optional)

aliases

a JSON array of strings, providing alternate names for this record (optional)

default

a default value for field when lack

order

ordering of this field.

Enum

type name

enum

name(必有属性)

a JSON string

symbols(必有属性)

a JSON array, listing symbols, as JSON strings (required). All symbols in an enum must be uniqu

namespace

a JSON string that qualifies the name(optional)

doc

a JSON string providing documentation to the user of this schema (optional)

aliases

a JSON array of strings, providing alternate names for this record (optional)

Arrays

type name

array

items

the schema of the array’s items

Maps

type name

map

values

the schema of the map’s values( eg:{“type”: “map”, “values”: “long”} )

Fixed

type name

fixed

name(必有属性)

a string naming this fixed (required)

namespace

a JSON string that qualifies the name(optional)

aliases

a JSON array of strings, providing alternate names for this record (optional)

size

aan integer, specifying the number of bytes per value (required)

Test.avsc文件 所有格式实例

说明:Test.avsv文件,利用avro的插件可生成对应的Test类,这个类可以利用avro的API序列化/反序列化

代码语言:javascript
复制
{ 
"namespace": "avro.domain", 
"type": "record", 
"name": "Test", 
"fields": [   
{ 
"name": "stringVar", "type": "string"},   
{ 
"name": "bytesVar", "type": ["bytes", "null"]},  
{ 
"name": "booleanVar",  "type": "boolean"},   
{ 
"name": "intVar",  "type": "int", "order":"descending"},   	
{ 
"name": "longVar",  "type": ["long", "null"], "order":"ascending"},   
{ 
"name": "floatVar",  "type": "float"},   
{ 
"name": "doubleVar",  "type": "double"},   
{ 
"name": "enumVar",  "type": { 
"type": "enum", "name": "Suit", "symbols" : ["SPADES ", "HEARTS", "DIAMONDS", "CLUBS"]}},   
{ 
"name": "strArrayVar", "type": { 
"type": "array", "items": "string"}},   
{ 
"name": "intArrayVar", "type": { 
"type": "array", "items": "int"}},     
{ 
"name": "mapVar", "type": { 
"type": "map", "values": "long"}},   
{ 
"name": "fixedVar", "type": { 
"type": "fixed", "size": 16, "name": "md5"}} 
] 
利用AVRO定义avdl文件,生成类

avdl文件用于avro生成协议方法的。

实现步骤:

  1. 创建maven项目
  2. 添加pom依赖
代码语言:javascript
复制
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--日志依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<!-- avro的依赖 -->
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-ipc</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.7.5</version>
<executions>
<execution>
<id>schemas</id>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
<goal>protocol</goal>
<goal>idl-protocol</goal>
</goals>
<configuration>
<!--存放avsc文件的地址-->
<sourceDirectory>${ 
project.basedir}/src/main/avro/</sourceDirectory>
<!--生成源码的地址-->
<outputDirectory>${ 
project.basedir}/src/main/java/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
  1. 在src\main\avro目录下新建一个后缀为avsc的文件,比如User.avsc文件
在这里插入图片描述
在这里插入图片描述
  1. 根据avro格式要求以及业务要求编辑这个文件(这里只做简单的示范)
代码语言:javascript
复制
{
"namespace":"avro.pojo",
"type":"record",
"name":"User",
"fields":
[
{"name":"name","type":"string"},
{"name":"age","type":"int"}
]
}
  1. 生成代码 eclipse:(项目名右键)
在这里插入图片描述
在这里插入图片描述

idea:

在这里插入图片描述
在这里插入图片描述

就会在指定的目录下生成类:

在这里插入图片描述
在这里插入图片描述

这里生成的代码就不贴了,可以自己生成之后进行查看!

对实体类简单的调用
代码语言:javascript
复制
// User user = new User();
// user.setName("鲁智深");
// user.setAge(18);
// User user = new User("史进", 80);
// User user = User.newBuilder().setName("公孙胜").setAge(150).build();
// 利用原对象构建新对象
// 实际上底层是调用的clone方法来进行克隆
User user = User.newBuilder(new User("李逵", 80)).setAge(70).build();
System.out.println(user);
序列化
代码语言:javascript
复制
public void write() throws IOException { 

User user = new User("Amy", 40);
DatumWriter<User> dw = new SpecificDatumWriter<>(User.class);
DataFileWriter<User> dfw = new DataFileWriter<>(dw);
// 指定写出文件
dfw.create(user.getSchema(), new File("1.txt"));
dfw.append(user);
dfw.append(new User("Sam", 70));
dfw.append(new User("Bob", 70));
dfw.close();
}
反序列化
代码语言:javascript
复制
public void read() throws IOException { 

DatumReader<User> dr = new SpecificDatumReader<>(User.class);
DataFileReader<User> dfr = new DataFileReader<>(new File("1.txt"), dr);
// 提供了迭代机制来迭代读取数据
// while(dfr.hasNext()){ 

//
// User user = dfr.next();
// System.out.println(user);
// }
// Lambda表达式
// dfr.forEach(u -> System.out.println(u));
// 对象方法的传递
dfr.forEach(System.out::println);
dfr.close();
}

Avro天然支持RPC Avro是基于Netty的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200766.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序列化/反序列化机制
  • Avro-大数据通用的序列化器
    • 简介
      • Avro支持类型
        • Test.avsc文件 所有格式实例
          • 利用AVRO定义avdl文件,生成类
            • 对实体类简单的调用
              • 序列化
                • 反序列化
                相关产品与服务
                文件存储
                文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档