Avro「建议收藏」

Avro「建议收藏」序列化/反序列化机制将对象转化为字节来进行存储称之为序列化;将字节还原会对象的过程称之为反序列化java中的序列化反序列化机制:需要利用原生流来实现,Serializable(该对象可以进行序列化/反序列化),static/transient(被修饰之后不能序列化/反序列化),serialVersionUID(版本号,如果版本号对上了再进行序列化/反序列,如果对不上,不进行序列化/反序列化…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

序列化/反序列化机制

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

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序列化/反序列化

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

Jetbrains全家桶1年46,售后保障稳定

利用AVRO定义avdl文件,生成类

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

实现步骤:

  1. 创建maven项目
  2. 添加pom依赖
<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文件
    在这里插入图片描述
  2. 根据avro格式要求以及业务要求编辑这个文件(这里只做简单的示范)
{
"namespace":"avro.pojo",
"type":"record",
"name":"User",
"fields":
[
{"name":"name","type":"string"},
{"name":"age","type":"int"}
]
}
  1. 生成代码
    eclipse:(项目名右键)
    在这里插入图片描述idea:
    在这里插入图片描述就会在指定的目录下生成类:
    在这里插入图片描述
    这里生成的代码就不贴了,可以自己生成之后进行查看!

对实体类简单的调用

// 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);

序列化

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();
}

反序列化

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的

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • node读取文件操作

    node读取文件操作导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read,createReadStream三个方法,针对写操作为我们提供了writeFile,write,createWriteStream三个方法,下面分析一下它们的区别:一、readFile和writeFile1、readFile…

  • Lucene 3.0.0 的TokenStream与Analyzer

    Lucene 3.0.0 的TokenStream与Analyzer如果你看的Lucene相关的书是很老版本的,比如说2.4或者更早,那么对于这个版本中的Analyzer可能就不那么容易接受了,我也是看的<lucene分析与应用>这本书,比较古老的版本.今天读了一下源代码,大概说说心得,我从SimpleAnalyzer说起.SimpleAnalyzer的作用就是把一段字符串中除了符号和非文字的内容作为分…

  • Anycast 公网加速 AIA解决方案

    Anycast 公网加速 AIA解决方案Anycast公网加速AIA简介Anycast公网加速(AnycastInternetAcceleration,AIA)是一个覆盖多地的动态加速网络,可以大幅提升您业务的公网访问体验。不同于其他应用层加速服务,AIA能实现IP传输的质量优化和多入口就近接入,减少网络传输的抖动、丢包,最终提升云上应用的服务质量,扩大服务范围,精简后端部署。Anycast公网加速AIA功能Anycast公网加速提供多种强大功能,提升应用访问体验的同时,易于部署和管理。1、公网IP任播购买

  • mysql 5.5 驱动jar包_MySQL驱动jar包下载「建议收藏」

    mysql 5.5 驱动jar包_MySQL驱动jar包下载「建议收藏」MySQLJDBC驱动是Java连接MySQL数据库时要用到的驱动包,MySQL驱动就是赋值外界与数据的连接接口,对于专业的Java开发人员一定会使用到的MySQL驱动Jar包的,有需要的赶快来试试吧!【功能特点】易于开发的特点,包括通过自动注册服务提供商机制,标准化的连接有效性检查和分类的SQLExceptions的基础上可恢复/重试能力和一流的底层错误。DriverManager隔离解开包…

  • APK签名流程介绍[通俗易懂]

    APK签名流程介绍[通俗易懂]实际上,现在Android开发IDE自带签名功能,但是有时我们还是可能遇到自己签名apk的场景的,比如你有一个未签名的apk,但是你要adbinstall到device上,这时我们在adbinstall之前就必须对该apk进行签名处理才能install成功,这篇文章就简单的介绍下apk签名流程吧。1、生成签名证书签名需要签名证书,签名证书类型实际上是有很多的,如jks、keysto…

  • php json_decode解析失败及错误处理

    php json_decode解析失败及错误处理一般情况下,获取到一段json内容,直接json_decode($content,true)就转成array来用了,很方便。但是,如果给你提供json内容的接口出了点问题,给的json不标准或是干脆有错误,那就要想办法来找出问题了。先看看json_encode的php官方文档源码:http://cn2.php.net/manual/en/…失败时返回NULL<?php//$json='{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5,”name”:”.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号