avro-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Avinash Dongre <dongre.avin...@gmail.com>
Subject Re: Sending Apache avro serialized data to thrift server
Date Mon, 17 Jun 2013 03:15:29 GMT
> Hi,
> I am trying to send avro serialized data to my thrift server. But when I
> try to de-serialized I get exception
> org.apache.avro.AvroRuntimeException: Malformed data. Length is negative:
> -51
>
> If I do the same operation in the same vm process everything works fine.
>
> Here is my small code.
>
> public static GenericRecord createContentNestedObject() throws Exception {
>     GenericRecord image1 = new GenericData.Record(IMAGE_SCHEMA);
>     image1.put("uri", new Utf8("http://javaone.com/keynote_large.jpg"));
>     image1.put("width", 0);
>     image1.put("height", 0);
>     image1.put("size", 2);
>     image1.put("title", new Utf8("Javaone Keynote"));
>     return image1;
>   }
>
>   // Helper Method to serialize the object from avro to bytebuffer
>   public static ByteBuffer serialize(GenericRecord content, Schema schema)
>       throws Exception {
>
>     ByteArrayOutputStream out = new ByteArrayOutputStream();
>     DatumWriter<GenericRecord> writer = new
> GenericDatumWriter<GenericRecord>(
>         schema);
>     // create Binary Encoder
>     EncoderFactory ef = new EncoderFactory();
>     BinaryEncoder be = ef.binaryEncoder(out, null);
>     writer.write(content, be);
>     be.flush();
>     out.close();
>
>     return ByteBuffer.wrap(out.toByteArray());
>   }
>
>   public static void main(String[] args) throws Exception {
>     try {
>       GenericRecord rd = createContentNestedObject();
>       bf = serialize(rd, IMAGE_SCHEMA);
>
>     } catch (Exception e) {
>       // TODO Auto-generated catch block
>       e.printStackTrace();
>     }
>
>     // Deserialization.
>     DatumReader<GenericRecord> reader = new
> GenericDatumReader<GenericRecord>(IMAGE_SCHEMA_1);
>     ByteArrayOutputStream out = new ByteArrayOutputStream();
>     try {
>       out.write(bf.array());
>     } catch (IOException e1) {
>       // TODO Auto-generated catch block
>       e1.printStackTrace();
>     }
>     BinaryDecoder decoder =
> DecoderFactory.get().binaryDecoder(out.toByteArray(), null);
>     try {
>       GenericRecord result = reader.read(null, decoder);
>       System.out.println("RESULT : " + result.toString());
>     } catch (IOException e) {
>       // TODO Auto-generated catch block
>       e.printStackTrace();
>     }
>
> This code works. When I send the bf to my thrift api , I am getting the
> error,
> my thrift api is simple which accept ByteBuffer and try to deserialize it.
>
> following is the code in the thrift server api
>
> DatumReader<GenericRecord> reader = new
> GenericDatumReader<GenericRecord>(IMAGE_SCHEMA_1);
>     ByteArrayOutputStream out = new ByteArrayOutputStream();
>     try {
>       out.write(bf.array());
>     } catch (IOException e1) {
>       // TODO Auto-generated catch block
>       e1.printStackTrace();
>     }
>     BinaryDecoder decoder =
> DecoderFactory.get().binaryDecoder(out.toByteArray(), null);
>     try {
>       GenericRecord result = reader.read(null, decoder);
>       System.out.println("RESULT : " + result.toString());
>     } catch (IOException e) {
>       // TODO Auto-generated catch block
>       e.printStackTrace();
>     }
>
>
>
> What is wrong here.
>
>
> Thanks
> Aviansh
>
>
>

Mime
View raw message