[ 
https://issues.apache.org/jira/browse/AVRO-1066?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13257162#comment-13257162
 ] 

Daniel Lord commented on AVRO-1066:
-----------------------------------

There was a post on the mailing list about this a few weeks ago.  I just tested 
the suggested fix there and it works for me.  Changing ParsingEncoder's push 
method to this worked for me.

  /** Push a new collection on to the stack. */
  protected final void push() {
    if (++pos >= counts.length) {
      counts = Arrays.copyOf(counts, pos + 10);
    }
    counts[pos] = 0;
  }
                
> ArrayIndexOutOfBoundsException in ParsingEncoder when trying to use a json 
> encoder to serialize a deep object graph
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: AVRO-1066
>                 URL: https://issues.apache.org/jira/browse/AVRO-1066
>             Project: Avro
>          Issue Type: Bug
>    Affects Versions: 1.6.2
>            Reporter: Daniel Lord
>
> I have an avro record that can have an array of children records of the same 
> type.  If this structure gets to be too deep then I continually get an 
> ArrayOutOfBoundsException in ParsingEncoder when trying to use a json 
> encoder.  This works fine when using a binary encoder.  My schema looks 
> something like this: 
> {
>     "name" : "MyRecord",
>     "type" : "record",
>     "fields" : [
>         {
>             "name" : "fooField",
>             "type" : "int"
>         },
>         {
>             "name" : "childRecords",
>             "type" : [ "null", { "type" : "array", "items" : "MyRecord" } ]
>         }
>     ]
> }
> The code I'm using to capture a JSON string for debugging looks like this: 
>         ByteArrayOutputStream os = null;
>         try {
>             os = new ByteArrayOutputStream(2048);
>             final Encoder jsonEncoder = 
> EncoderFactory.get().jsonEncoder(MyRecord.SCHEMA$, os);
>             final DatumWriter<MyRecord> datumWriter = new 
> SpecificDatumWriter<MyRecord>(MyRecord.class);
>             datumWriter.write(record, jsonEncoder);
>             jsonEncoder.flush();
>             return new String(os.toByteArray(), Charset.defaultCharset());
>         } catch (IOException e) {
>             return null;
>         } finally {
>             if (os != null) {
>                 try {
>                     os.close();
>                 } catch (IOException e) {
>                 }
>             }
>         }
> The error I get looks like this: 
> java.lang.ArrayIndexOutOfBoundsException: 10
>       at org.apache.avro.io.ParsingEncoder.push(ParsingEncoder.java:55)
>       at org.apache.avro.io.JsonEncoder.writeArrayStart(JsonEncoder.java:231)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:125)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:129)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:67)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:57)
> <my line calling datumWriter.write> 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to