Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.8.2
-
None
-
None
-
None
Description
byte[] data type resolves to array type when specified in union as { "type": "null", "bytes" } in the avro schema defined for a byte[] by using
ReflectData.allowNull().get().getSchema(x.class);
and then fails because byte primitive is not supported in array type after resolveUnion resolves it to array using Reflect data for datum class - class [B as described in this function below:
protected void writeArray(Schema schema, Object datum, Encoder out) throws IOException { if (datum instanceof Collection) { super.writeArray(schema, datum, out); return; } Class<?> elementClass = datum.getClass().getComponentType(); if (null == elementClass) { // not a Collection or an Array throw new AvroRuntimeException("Array data must be a Collection or Array"); } Schema element = schema.getElementType(); if (elementClass.isPrimitive()) { Schema.Type type = element.getType(); out.writeArrayStart(); switch(type) { case BOOLEAN: if(elementClass.isPrimitive()) ArrayAccessor.writeArray((boolean[]) datum, out); break; case DOUBLE: ArrayAccessor.writeArray((double[]) datum, out); break; case FLOAT: ArrayAccessor.writeArray((float[]) datum, out); break; case INT: if(elementClass.equals(int.class)) { ArrayAccessor.writeArray((int[]) datum, out); } else if(elementClass.equals(char.class)) { ArrayAccessor.writeArray((char[]) datum, out); } else if(elementClass.equals(short.class)) { ArrayAccessor.writeArray((short[]) datum, out); } else { arrayError(elementClass, type); } break; case LONG: ArrayAccessor.writeArray((long[]) datum, out); break; default: arrayError(elementClass, type); } out.writeArrayEnd(); } else { out.writeArrayStart(); writeObjectArray(element, (Object[]) datum, out); out.writeArrayEnd(); } }