Hello,

I have a question about the features of the Java library for Avro.

In my application I have a set of "event" classes with Avro annotations
(@AvroName, @AvroIgnore, ...).

Currently I do the following:
1) use ReflectData.get().getSchema(clazz) to get the Schema of the class
2) use the reflection API to get object instances field data to feed into a
GenericRecordBuilder
3) use GenericDatumWriter<GenericRecord> to serialize my data

Note that I deliberately chose not to use code generation.

In my code, what I did for #2 was this:
- iterate over each (public) member property of the class
- find the field name known for avro (i.e., actual field name or name
provided with @AvroName if the annotation is present)
- check if there is a schema field for that name
- get the value of that field
- set the value for that schema field in the generic record builder

I'm wondering if Avro currently provides utilities to easily perform what I
described above?

More precisely, is there an API for easily extracting some sort of Map of
<Schema.Field, Object> where Object would be the value for a specific
field, or even better, an API for directly creating a GenericRecord object
based on an instance of an Avro-annotated class and a Schema?

If not, could it be added to the Java Avro library?

I'd love to be able to do something like new
GenericRecordBuilder(schema).extractValues(someObject).build() and not have
to worry about reflection, caching, etc.

Having the ability to also convert from a GenericRecord object to an
instance of an Avro-annotated class would also be great.

Here's the code I'm currently using:
- convert to generic record:
https://gist.github.com/dsebastien/ab3f2828a84289ad1b7cf29d674c4faf
- get field name:
https://gist.github.com/dsebastien/82bc9b1a7158d69440312c661bbac1a7


kr,
Sébastien D

Reply via email to