Avro序列化与反序列化

参考资料:
Avro Api:
http://avro.apache.org/docs/current/api/java/index.html
大牛的博客:
http://blog.csdn.net/xyw_blog/article/details/8967362
http://www.cnblogs.com/fillPv/p/5009737.html
http://blog.kazaff.me/2015/04/30/Avro%E7%9A%84%E4%B8%89%E7%A7%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%96%B9%E6%B3%95/
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/

   将jar包放入制定的文件夹下

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

{“namespace”: “example.avro”,
“type”: “record”,
“name”: “User”,
“fields”: [
{“name”: “name”, “type”: “string”},
{“name”: “favorite_number”, “type”: [“int”, “null”]},
{“name”: “favorite_color”, “type”: [“string”, “null”]}
]
}

3、打开cmd,进入到该目录,执行命令生成User类,注意命令后面有个”.”,表示生成的代码放在本目录下。

java -jar avro-tools-1.7.7.jar compile schema user.avsc java .
  

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

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


org.apache.avro
avro
1.7.7

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

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

有兴趣可自行查看生成的User.java类
6.
用java实现序列化与反序列化

package com.netease.kafka.hdfs.avro;

import java.io.File;
import java.io.IOException;

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;

/**
 * 
 * @author bjfeixiuhong 2016年6月27日 Serialize User to disk/Deserialize disk to User
 */
public class AvroTest {
    public static void SerializeUser() throws IOException {
        //
        User user1 = new User();
        user1.setName("zhangsan");
        user1.setFavoriteNumber(21);
        user1.setFavoriteColor(null);

        // Alternate constructor
        User user2 = new User("Ben", 7, "red");

        // Construct via builder
        User user3 = User.newBuilder().setName("Charlie")
                .setFavoriteColor("blue").setFavoriteNumber(null).build();
        String path = "D:\\tmp\\user.avro"; // avro文件存放目录
        DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(
                User.class);
        DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(
                userDatumWriter);
        dataFileWriter.create(user1.getSchema(), new File(path));
        // 把生成的user对象写入到avro文件
        dataFileWriter.append(user1);
        dataFileWriter.append(user2);
        dataFileWriter.append(user3);
        dataFileWriter.close();

    }
    public static void DeserializeUser() throws IOException{
        DatumReader<User> userDatumReader=new SpecificDatumReader<User>(User.class);
        File file=new File("D:\\tmp\\user.avro");
        DataFileReader<User> dataFileReader=new DataFileReader<User>(file,userDatumReader);
        User user=null;
        while(dataFileReader.hasNext()){
            user=dataFileReader.next();
            System.out.println(user);
        }
    }
    public static void main(String[] args) throws IOException {
        SerializeUser();
        DeserializeUser();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值