thrift-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Avinash Dongre <dongre.avin...@gmail.com>
Subject Sending Apache avro serialized data to thrift server
Date Sun, 16 Jun 2013 17:59:56 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
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message