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)