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

Xu ShiChang Desmond commented on AVRO-2151:
-------------------------------------------

Basically, its ReflectDatumWriter's writeObjectArray that fails to call 
startItem on the encoder. (it screws the json encoder up but binary encoder 
doesnt care)

{code:java}
private void writeObjectArray(Schema element, Object[] data, Encoder out) 
throws IOException {
    int size = data.length;
    out.setItemCount(size);
    for (int i = 0; i < size; i++) {
      this.write(element, data[i], out);
    }
  }
{code}


> ReflectData, JsonEncoder encoding runtime exception
> ---------------------------------------------------
>
>                 Key: AVRO-2151
>                 URL: https://issues.apache.org/jira/browse/AVRO-2151
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.8.2
>            Reporter: Xu ShiChang Desmond
>            Priority: Minor
>
> Using reflect data has a problem if a field is an array of an object (eg 
> String[]) and using JsonEncoder.
> SimpleĀ  reproduction of the problem
> {code:java}
> public static class Record {
>   private String[] myfield = new String[]{"hello world"};
> }
> public static void main(String[] args) throws IOException {
>   Schema s = SchemaBuilder.record("Record")
>     .fields()
>       .name("myfield").type(
>         Schema.createArray(
>          Schema.create(Schema.Type.STRING)
>         )
>       ).noDefault()
>     .endRecord();
>   System.out.println(s);
>   ReflectData d = new ReflectData();
>   d.createDatumWriter(s).write(new Record(),   
> EncoderFactory.get().jsonEncoder(s, System.out, true));
> }
> {code}
> {code:java}
> org.apache.avro.AvroTypeException: Incorrect number of items written. 1 more 
> required.
>       at org.apache.avro.io.ParsingEncoder.pop(ParsingEncoder.java:60)
>       at org.apache.avro.io.JsonEncoder.writeArrayEnd(JsonEncoder.java:259)
>       at 
> org.apache.avro.reflect.ReflectDatumWriter.writeArray(ReflectDatumWriter.java:112)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:120)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
>       at 
> org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:159)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:166)
>       at 
> org.apache.avro.specific.SpecificDatumWriter.writeField(SpecificDatumWriter.java:90)
>       at 
> org.apache.avro.reflect.ReflectDatumWriter.writeField(ReflectDatumWriter.java:191)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:156)
>       at 
> org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:118)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
>       at 
> org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:159)
>       at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:62)
>       at Bugged.main(Bugged.java:30)
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to