You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Karthik (JIRA)" <ji...@apache.org> on 2017/10/09 21:34:00 UTC
[jira] [Created] (AVRO-2095) Avro 1.8.2 encode in c++ -
java.lang.ArrayIndexOutOfBoundsException
Karthik created AVRO-2095:
-----------------------------
Summary: Avro 1.8.2 encode in c++ - java.lang.ArrayIndexOutOfBoundsException
Key: AVRO-2095
URL: https://issues.apache.org/jira/browse/AVRO-2095
Project: Avro
Issue Type: New Feature
Components: c++, java
Affects Versions: 1.8.2
Environment: C++, Java
Reporter: Karthik
I have the following schema
{code:json}
[
{
"namespace": "com.test",
"name": "MyDevice",
"type": "record",
"doc": "client device",
"fields": [
{
"name": "deviceId",
"type": [
"null",
"string"
],
"default": null,
"doc": "Usually unique MAC address"
}
]
},
{
"namespace": "com.test",
"name": "Event",
"type": "record",
"doc": "event",
"fields": [
{
"name": "myDevice",
"type": [
"null",
"com.test.MyDevice"
],
"default": null,
"doc": "Device information"
}
]
}
]
{code}
I installed avro 1.8.2 on my ubuntu build machine and generated test.h using avrogencpp tool.
Then, I created binary encoded avro data as follows:
{code:c++}
MyDevice device;
device.deviceId.set_string("device1");
Event event;
event.myDevice.set_MyDevice(device);
std::vector<char> bytes;
std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream(1);
avro::EncoderPtr e = avro::binaryEncoder();
e->init(*out);
avro::encode(*e, event);
out->flush();
{code}
I deserialize my data in Java application as follows:
{code:java}
Schema schema = SchemaUtils.getSchemaFromFile("src/main/resources/schemas/test.avsc");
DatumReader<GenericRecord> genericDatumReader = new GenericDatumReader<>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(data, null);
try {
GenericRecord userData = genericDatumReader.read(null, decoder);
System.out.println(userData);
} catch (IOException e) {
e.printStackTrace();
}
{code}
And the result is
{noformat}
java.lang.ArrayIndexOutOfBoundsException: 7
at org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:424)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145)
{noformat}
But if I do the same using a simple schema (without union), it works perfectly
{code:json}
{
"namespace": "com.test",
"name": "MyDevice",
"type": "record",
"doc": "client device",
"fields": [
{
"name": "deviceId",
"type": [
"null",
"string"
],
"default": null,
"doc": "Usually unique MAC address"
}
]
}
{code}
Any help appreciated ! Thanks !
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)