大家好,欢迎来到IT知识分享网。
本文的目的主要是总结下基于Avro Schema代码生成,然后进行序列化和反序列化开发的基本流程。需要指出的是,Avro并不要求一定得根据Schema文件生成代码,这对于动态类型语言很有用。
1. 添加Maven依赖
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
4.0.0
learn
learn.avro
1.0-SNAPSHOT
org.apache.avro
avro
1.7.7
org.apache.avro
avro-maven-plugin
1.7.7
generate-sources
schema
protocol
idl-protocol
${project.basedir}/src/main/avro/
${project.basedir}/src/main/java/
org.apache.maven.plugins
maven-compiler-plugin
1.7
1.7
2.定义schema文件(users.avsc)
放置到src/main/avro目录下
{“namespace”: “examples.avro.simple”,
“type”: “record”,
“name”: “User”,
“fields”: [
{“name”: “name”, “type”: “string”},
{“name”: “favorite_number”, “type”: [“int”, “null”]},
{“name”: “favorite_color”, “type”: [“string”, “null”]}
]
}
namespace:包名
type: record表示记录,可以理解为几个field构成的一个record,类似于Java的JavaBean
name:类名
fiels:成员变量,favorite_number最后会解释成getFavoriteNumber和setFavoriteNumber
3. 生成User类
在Intellij Idea的Maven视图中,learn avro->Plugins->avro->avro:schema,右击avro:schema,执行Run Maven Build,生成schema对应的Java实体类
/**
* Autogenerated by Avro
*
* DO NOT EDIT DIRECTLY
*/
package examples.avro.simple;
@SuppressWarnings(“all”)
@org.apache.avro.specific.AvroGenerated
public class User extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse(“{\”type\”:\”record\”,\”name\”:\”User\”,\”namespace\”:\”example.avro\”,\”fields\”:[{\”name\”:\”name\”,\”type\”:\”string\”},{\”name\”:\”favorite_number\”,\”type\”:[\”int\”,\”null\”]},{\”name\”:\”favorite_color\”,\”type\”:[\”string\”,\”null\”]}]}”);
public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
@Deprecated public java.lang.CharSequence name;
@Deprecated public java.lang.Integer favorite_number;
@Deprecated public java.lang.CharSequence favorite_color;
/**
* Default constructor. Note that this does not initialize fields
* to their default values from the schema. If that is desired then
* one should use newBuilder()
.
*/
public User() {}
/**
* All-args constructor.
*/
public User(java.lang.CharSequence name, java.lang.Integer favorite_number, java.lang.CharSequence favorite_color) {
this.name = name;
this.favorite_number = favorite_number;
this.favorite_color = favorite_color;
}
public org.apache.avro.Schema getSchema() { return SCHEMA$; }
// Used by DatumWriter. Applications should not call.
public java.lang.Object get(int field$) {
switch (field$) {
case 0: return name;
case 1: return favorite_number;
case 2: return favorite_color;
default: throw new org.apache.avro.AvroRuntimeException(“Bad index”);
}
}
// Used by DatumReader. Applications should not call.
@SuppressWarnings(value=”unchecked”)
public void put(int field$, java.lang.Object value$) {
switch (field$) {
case 0: name = (java.lang.CharSequence)value$; break;
case 1: favorite_number = (java.lang.Integer)value$; break;
case 2: favorite_color = (java.lang.CharSequence)value$; break;
default: throw new org.apache.avro.AvroRuntimeException(“Bad index”);
}
}
/**
* Gets the value of the ‘name’ field.
*/
public java.lang.CharSequence getName() {
return name;
}
/**
* Sets the value of the ‘name’ field.
* @param value the value to set.
*/
public void setName(java.lang.CharSequence value) {
this.name = value;
}
/**
* Gets the value of the ‘favorite_number’ field.
*/
public java.lang.Integer getFavoriteNumber() {
return favorite_number;
}
/**
* Sets the value of the ‘favorite_number’ field.
* @param value the value to set.
*/
public void setFavoriteNumber(java.lang.Integer value) {
this.favorite_number = value;
}
/**
* Gets the value of the ‘favorite_color’ field.
*/
public java.lang.CharSequence getFavoriteColor() {
return favorite_color;
}
/**
* Sets the value of the ‘favorite_color’ field.
* @param value the value to set.
*/
public void setFavoriteColor(java.lang.CharSequence value) {
this.favorite_color = value;
}
/** Creates a new User RecordBuilder */
public static User.Builder newBuilder() {
return new User.Builder();
}
/** Creates a new User RecordBuilder by copying an existing Builder */
public static User.Builder newBuilder(User.Builder other) {
return new User.Builder(other);
}
/** Creates a new User RecordBuilder by copying an existing User instance */
public static User.Builder newBuilder(User other) {
return new User.Builder(other);
}
/**
* RecordBuilder for User instances.
*/
public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase
implements org.apache.avro.data.RecordBuilder {
private java.lang.CharSequence name;
private java.lang.Integer favorite_number;
private java.lang.CharSequence favorite_color;
/** Creates a new Builder */
private Builder() {
super(User.SCHEMA$);
}
/** Creates a Builder by copying an existing Builder */
private Builder(User.Builder other) {
super(other);
if (isValidValue(fields()[0], other.name)) {
this.name = data().deepCopy(fields()[0].schema(), other.name);
fieldSetFlags()[0] = true;
}
if (isValidValue(fields()[1], other.favorite_number)) {
this.favorite_number = data().deepCopy(fields()[1].schema(), other.favorite_number);
fieldSetFlags()[1] = true;
}
if (isValidValue(fields()[2], other.favorite_color)) {
this.favorite_color = data().deepCopy(fields()[2].schema(), other.favorite_color);
fieldSetFlags()[2] = true;
}
}
/** Creates a Builder by copying an existing User instance */
private Builder(User other) {
super(User.SCHEMA$);
if (isValidValue(fields()[0], other.name)) {
this.name = data().deepCopy(fields()[0].schema(), other.name);
fieldSetFlags()[0] = true;
}
if (isValidValue(fields()[1], other.favorite_number)) {
this.favorite_number = data().deepCopy(fields()[1].schema(), other.favorite_number);
fieldSetFlags()[1] = true;
}
if (isValidValue(fields()[2], other.favorite_color)) {
this.favorite_color = data().deepCopy(fields()[2].schema(), other.favorite_color);
fieldSetFlags()[2] = true;
}
}
/** Gets the value of the ‘name’ field */
public java.lang.CharSequence getName() {
return name;
}
/** Sets the value of the ‘name’ field */
public User.Builder setName(java.lang.CharSequence value) {
validate(fields()[0], value);
this.name = value;
fieldSetFlags()[0] = true;
return this;
}
/** Checks whether the ‘name’ field has been set */
public boolean hasName() {
return fieldSetFlags()[0];
}
/** Clears the value of the ‘name’ field */
public User.Builder clearName() {
name = null;
fieldSetFlags()[0] = false;
return this;
}
/** Gets the value of the ‘favorite_number’ field */
public java.lang.Integer getFavoriteNumber() {
return favorite_number;
}
/** Sets the value of the ‘favorite_number’ field */
public User.Builder setFavoriteNumber(java.lang.Integer value) {
validate(fields()[1], value);
this.favorite_number = value;
fieldSetFlags()[1] = true;
return this;
}
/** Checks whether the ‘favorite_number’ field has been set */
public boolean hasFavoriteNumber() {
return fieldSetFlags()[1];
}
/** Clears the value of the ‘favorite_number’ field */
public User.Builder clearFavoriteNumber() {
favorite_number = null;
fieldSetFlags()[1] = false;
return this;
}
/** Gets the value of the ‘favorite_color’ field */
public java.lang.CharSequence getFavoriteColor() {
return favorite_color;
}
/** Sets the value of the ‘favorite_color’ field */
public User.Builder setFavoriteColor(java.lang.CharSequence value) {
validate(fields()[2], value);
this.favorite_color = value;
fieldSetFlags()[2] = true;
return this;
}
/** Checks whether the ‘favorite_color’ field has been set */
public boolean hasFavoriteColor() {
return fieldSetFlags()[2];
}
/** Clears the value of the ‘favorite_color’ field */
public User.Builder clearFavoriteColor() {
favorite_color = null;
fieldSetFlags()[2] = false;
return this;
}
@Override
public User build() {
try {
User record = new User();
record.name = fieldSetFlags()[0] ? this.name : (java.lang.CharSequence) defaultValue(fields()[0]);
record.favorite_number = fieldSetFlags()[1] ? this.favorite_number : (java.lang.Integer) defaultValue(fields()[1]);
record.favorite_color = fieldSetFlags()[2] ? this.favorite_color : (java.lang.CharSequence) defaultValue(fields()[2]);
return record;
} catch (Exception e) {
throw new org.apache.avro.AvroRuntimeException(e);
}
}
}
}
4. User类序列化和反序列化测试
package examples.avro.simple;
import java.io.File;
import java.io.Serializable;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
public class UserTest {
public static void main(String[] args) throws Exception {
///无参构造函数,依赖设值注入
User user1 = new User();
user1.setName(“Alyssa”);
user1.setFavoriteNumber(256);
//user1没有对favorite color赋值
///注意:User并没有实现Java的Serializable接口
System.out.println(user1 instanceof Serializable);
///重载的构造方法
User user2 = new User(“Ben”, 7, “red”);
//使用builder构建对象
User user3 = User.newBuilder()
.setName(“Charlie”)
.setFavoriteColor(“blue”)
.setFavoriteNumber(null)
.build();
System.out.println(user3.getName() + “,” + user3.getFavoriteColor());
///1. 序列化包含Schema和3个User对象到c:/users.avro文件
DatumWriter userDatumWriter = new SpecificDatumWriter(User.class);
DataFileWriter dataFileWriter = new DataFileWriter(userDatumWriter);
dataFileWriter.create(user1.getSchema(), new File(“c:/users.avro”));
dataFileWriter.append(user1);
dataFileWriter.append(user2);
dataFileWriter.append(user3);
dataFileWriter.close();
///2. 从c:/users.avro文件反序列化对象
DatumReader userDatumReader = new SpecificDatumReader(User.class);
DataFileReader dataFileReader = new DataFileReader(new File(“c:/users.avro”), userDatumReader);
User user = null;
while (dataFileReader.hasNext()) {
// Reuse user object by passing it to next(). This saves us from
// allocating and garbage collecting many objects for files with
// many items.
user = dataFileReader.next(user);
System.out.println(user); ///输出JSON格式的数据,Avro对User类的toString进行了改写
}
}
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11270.html