You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@avro.apache.org by Philip Zeyliger <ph...@cloudera.com> on 2009/12/01 06:45:12 UTC

Re: Best way to read and write bytes of Avro object

Hi Douglas,

You shoudn't need a DataFileReader/Writer, I believe.  I recently wrote
something very similar as part of
https://issues.apache.org/jira/browse/AVRO-245.

In my case, on the "to bytes" path, I did:

      // Read from JSON
      GenericDatumReader<Object> reader = new
GenericDatumReader<Object>(schema);
      Object datum = reader.read(null, new JsonDecoder(schema, new
ByteArrayInputStream(data.getBytes("utf-8"))));

      // Write to an output stream
      GenericDatumWriter<Object> writer =  new
GenericDatumWriter<Object>(schema);
      writer.write(datum, new BinaryEncoder(out));



BinaryEncoder is probably what you want instead of DataFileWriter.

I used the generic API here, but specific should work in your case.


Cheers,

-- Philip



On Mon, Nov 30, 2009 at 11:42 AM, Douglas Campbell <de...@yahoo.com>wrote:

> Any thoughts on this?
>
>
>
> ----- Original Message ----
> From: Douglas Campbell <de...@yahoo.com>
> To: avro-user@hadoop.apache.org
> 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.
>
>
>
>