Uploaded image for project: 'Apache Avro'
  1. Apache Avro
  2. AVRO-2378

byte[] is not supported by Reflect data when specified in union as "type": "null", "bytes"

    XMLWordPrintableJSON

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();
          }
      
        }
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            r0s00f1 RAJAT SOMANI
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated: