I'm using java 1.6 and avro 1.2.
My use case is to be able to create an avro object, serialize/marshall it into
a byte array and base64 it, and then un-base64 it, desearialize/unmarshall it
back into the AvroObject.
Pretty simple right? This the code I needed to write to do that . Is there a
better way or utility classes in Avro java api which do this (leaving out the
base64 stuff perhaps)?
/** decodes base64'd data into bytes and then re-creates an avro object */
public AvroModel fromAvroData(String base64) throws IOException
{
AvroModel am = new AvroModel();
final byte[] avrobytes = new Base64().decode(base64.getBytes());
DatumReader dr = new SpecificDatumReader(am.getSchema());
SeekableByteArrayInputStream bin = new
SeekableByteArrayInputStream(avrobytes);
DataFileReader<AvroModel> dfr = new DataFileReader<AvroModel>(bin, dr);
dfr.next(am);
return am;
}
/**
Converts an AvroModel to avro base64 encoded string
*/
public String toAvroData(AvroModel m) throws IOException
{
DatumWriter dw = new SpecificDatumWriter(m.getSchema());
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataFileWriter<AvroModel> dfw = new
DataFileWriter<AvroModel>(m.getSchema(), bout, dw);
dfw.append(m);
dfw.flush();
return new String(new Base64().encode(bout.toByteArray()));
}
Note that for the "fromAvroData", I had to provide an implementation of
SeekableInput over a ByteArrayInputStream.
Thanks for the pointers.