avrorecord.java_Java使用avro序列化和反序列化

一、avro是一个数据序列化框架,可以高效得进行序列化和反序列化,支持C, C++, C#, Java, PHP, Python, 和Ruby语言。现在使用Java来读写。

二、环境搭建

1、下载avro-1.7.7.jar and avro-tools-1.7.7.jar两个jar包,放到指定文件目录。下载地址 http://www.trieuvan.com/apache/avro/avro-1.7.7/java/

我放到了D:\soft\avro 文件夹,在改目录下新建java文件夹,用来存放生成的Java代码

2、该目录下新建user.avsc文件,内容是:

copycode.gif{"namespace": "example.avro", "type": "record", "name": "User", "fields": [

{"name": "name", "type": "string"},

{"name": "favorite_number",  "type": ["int", "null"]},

{"name": "favorite_color", "type": ["string", "null"]}]

}

copycode.gif

3、打开cmd,进入到该目录,执行命令生成User类,注意命令后面有个".",表示生成的代码放在本目录下。java -jar avro-tools-1.7.7.jar compile schema user.avsc java .

814213-20151201140011499-2016906441.png

在该文件夹下的Java文件下的../example/avro/目录下就会生成User.java文件。

4.使用eclipse新建maven项目,在pom.xml加入avro的依赖。

org.apache.avro

avro

1.7.7

三、生成的User.java文件的内容如下。

把生成的User.java类复制到工程中,注意这个User.java里面生成的User类及其内部类的包名默认是user.avsc文件中的namespace的值,

在本例中也就是example.avro。需要全部替换为自己的包名。

最简单的方法就是把User.java中的example.avro全部替换为自己的包名。

copycode.gif/**

* Autogenerated by Avro

*

* DO NOT EDIT DIRECTLY */package example.avro;

@SuppressWarnings("all")

@org.apache.avro.specific.AvroGeneratedpublic 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 example.avro.User.Builder newBuilder() {    return new example.avro.User.Builder();

}

/** Creates a new User RecordBuilder by copying an existing Builder */

public static example.avro.User.Builder newBuilder(example.avro.User.Builder other) {    return new example.avro.User.Builder(other);

}

/** Creates a new User RecordBuilder by copying an existing User instance */

public static example.avro.User.Builder newBuilder(example.avro.User other) {    return new example.avro.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(example.avro.User.SCHEMA$);

}

/** Creates a Builder by copying an existing Builder */

private Builder(example.avro.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(example.avro.User other) {            super(example.avro.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 example.avro.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 example.avro.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 example.avro.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 example.avro.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 example.avro.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 example.avro.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);

}

}

}

}

copycode.gif

四、用Java实现序列化,即写avro文件。

新建一个Java类

copycode.gifpublic static void main(String[] args) throws IOException {

// 声明并初始化User对象

// 方式一

User user1 = "zhangsan"21

User user2 =  User("Ben", 7, "red"

User user3 ="Charlie""blue" userDatumWriter =  SpecificDatumWriter(User. dataFileWriter =  DataFileWriter File(path

copycode.gif

run一下代码,查看指定文件目录是否生成了avro文件。

五、Java读取avro文件,即实现avro反序列化。

copycode.gifpublic static void main(String[] args) throws IOException {

DatumReader reader = new SpecificDatumReader(User.class);

DataFileReader dataFileReader = new DataFileReader(new File("D:\\tmp\\user.avro"), reader);

User user = null;       while (dataFileReader.hasNext()) {

user = dataFileReader.next();

System.out.println(user);

}

}

copycode.gif

运行结果:{"name": "zhangsan", "favorite_number": 21, "favorite_color": null}

{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}

{"name": "Charlie", "favorite_number": null, "favorite_color": "blue"}

至此,例子写完。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值