Any thoughts on this?


----- Original Message ----
From: Douglas Campbell <[email protected]>
To: [email protected]
Sent: Wed, November 25, 2009 7:31:02 PM
Subject: Best way to read and write bytes of Avro object

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.


      

Reply via email to