AVRO - 通过生成类来反序列化

如前所述,可以通过生成与模式对应的类或使用解析器库将Avro模式读入程序.本章介绍如何使用Avro生成类和反序列化数据来读取模式.

通过生成类进行反序列化

序列化数据存储在文件 emp.avro 中.您可以使用Avro反序列化并阅读它.

存储序列化数据

按照下面给出的步骤从文件中反序列化序列化数据.

步骤1

创建 DatumReader 界面使用 SpecificDatumReader 类.

DatumReader<emp>empDatumReader = new SpecificDatumReader<emp>(emp.class); ;

步骤2

emp 类实例化 DataFileReader .该类从文件中读取序列化数据.它需要 Dataumeader 对象,以及存在序列化数据的文件的路径,作为构造函数的参数.

DataFileReader<emp> dataFileReader = new DataFileReader(new File("/path/to/emp.avro"), empDatumReader);

步骤3

使用 DataFileReader 的方法打印反序列化数据.

  • 如果Reader中有任何元素, hasNext()方法将返回一个布尔值.

  • DataFileReader next()方法返回Reader中的数据.

while(dataFileReader.hasNext()){

   em=dataFileReader.next(em);
   System.out.println(em);
}

示例 - 通过生成类进行反序列化

以下完整程序显示如何反序列化使用Avro的文件中的数据.

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

import org.apache.avro.file.DataFileReader;
import org.apache.avro.io.DatumReader;
import org.apache.avro.specific.SpecificDatumReader;

public class Deserialize {
   public static void main(String args[]) throws IOException{
	
      //DeSerializing the objects
      DatumReader<emp> empDatumReader = new SpecificDatumReader<emp>(emp.class);
		
      //Instantiating DataFileReader
      DataFileReader<emp> dataFileReader = new DataFileReader<emp>(new
         File("/home/Hadoop/Avro_Work/with_code_genfile/emp.avro"), empDatumReader);
      emp em=null;
		
      while(dataFileReader.hasNext()){
      
         em=dataFileReader.next(em);
         System.out.println(em);
      }
   }
}

浏览生成代码的目录.在这种情况下,在 home/Hadoop/Avro_work/with_code_gen.

$ cd home/Hadoop/Avro_work/with_code_gen/

现在,将上述程序复制并保存在名为 DeSerialize.java 的文件中.编译并执行它,如下所示 :

$ javac Deserialize.java
$ java Deserialize

输出

{"name": "omar", "id": 1, "salary": 30000, "age": 21, "address": "Hyderabad"}
{"name": "ram", "id": 2, "salary": 40000, "age": 30, "address": "Hyderabad"}
{"name": "robbin", "id": 3, "salary": 35000, "age": 25, "address": "Hyderabad"}