You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Xu ShiChang Desmond (JIRA)" <ji...@apache.org> on 2018/05/09 07:50:00 UTC

[jira] [Commented] (AVRO-2151) ReflectData, JsonEncoder encoding runtime exception

    [ 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)