Как объяснено в в этом ответе , мы можем добавить пользовательское преобразование в схему avro. Как мы можем объединить это с отражением?
предположим, что мы сохранили пример из 1 ,
class Java8LocalDateConversion extends Conversion<LocalDate> {
@Override
public Class<LocalDate> getConvertedType() {
return LocalDate.class;
}
@Override
public String getLogicalTypeName() {
// v--- reuse the logical type `date`
return "date";
}
@Override
// convert LocalDate to Integer
public Integer toInt(LocalDate value, Schema schema, LogicalType type) {
return (int) value.toEpochDay();
}
@Override
// parse LocalDate from Integer
public LocalDate fromInt(Integer value, Schema schema, LogicalType type) {
return LocalDate.ofEpochDay(value);
}
}
, но мы хотим использовать отражение для сериализации:
class Example {
LocalDatet;
}
Обычный подход к отражению:
@Test
void testExample() throws IOException {
Schema schema = ReflectData.get().getSchema(Example.class);
DatumWriter<Example> datumWriter = new ReflectDatumWriter<>(schema);
DataFileWriter<Example> dataFileWriter = new DataFileWriter<>(datumWriter);
dataFileWriter.create(schema, new File("tmp.avro"));
Example e = new Example();
e.t = LocalDate.of(2020, 4, 20);
dataFileWriter.append(e);
dataFileWriter.close();
}
Как указать в testExample
, что следует использовать пользовательское преобразование? (Я не могу обновить свою версию avro, и этот вопрос должен быть более обобщенным c, чем просто типы дат java8).