Apache Avroは、コンパクトで高速なバイナリデータ形式で、シリアル化のための豊富なデータ構造を提供します。ただし、シリアル化する必要があるオブジェクトのスキーマを(JSONで)定義する必要があります。
場合によっては、これは不可能です(例:そのJavaオブジェクトのクラスには、外部ライブラリの型が外部Javaクラス)のメンバーがいくつかあります)。したがって、オブジェクトの.classファイルから情報を取得し、そのオブジェクトのAvroスキーマを生成できるツールがあるのだろうか(Gsonがオブジェクトの.class情報を使用して特定のオブジェクトをJSON文字列に変換するなど)。
Java Reflection API をご覧ください。
スキーマの取得は次のようになります。
Schema schema = ReflectData.get().getSchema(T);
実際の例については別の質問に関するDougの例 を参照してください。
この回答のクレジットは、Sean Busbyに帰属します。
ObjectMapper mapper = new ObjectMapper(new AvroFactory());
AvroSchemaGenerator gen = new AvroSchemaGenerator();
mapper.acceptJsonFormatVisitor(RootType.class, gen);
AvroSchema schemaWrapper = gen.getGeneratedSchema();
org.Apache.avro.Schema avroSchema = schemaWrapper.getAvroSchema();
String asJson = avroSchema.toString(true);
**例**
ポジョクラス
public class ExportData implements Serializable {
private String body;
// ... getters and setters
}
シリアライズ
File file = new File(fileName);
DatumWriter<ExportData> writer = new ReflectDatumWriter<>(ExportData.class);
DataFileWriter<ExportData> dataFileWriter = new DataFileWriter<>(writer);
Schema schema = ReflectData.get().getSchema(ExportData.class);
dataFileWriter.create(schema, file);
for (Row row : resultSet) {
String rec = row.getString(0);
dataFileWriter.append(new ExportData(rec));
}
dataFileWriter.close();
デシリアライズ
File file = new File(avroFilePath);
DatumReader<ExportData> datumReader = new ReflectDatumReader<>(ExportData.class);
DataFileReader<ExportData> dataFileReader = new DataFileReader<>(file, datumReader);
ExportData record = null;
while (dataFileReader.hasNext()){
record = dataFileReader.next(record);
// process record
}