@Override public DatumReader createDatumReader(Schema schema) { return new ReflectDatumReader(schema, schema, this); }
public T toObject(byte[] bytes) { Decoder decoder = DecoderFactory.defaultFactory().createBinaryDecoder(bytes, null); ReflectDatumReader<T> reader = null; try { reader = new ReflectDatumReader<T>(clazz); return reader.read(null, decoder); } catch(IOException e) { throw new SerializationException(e); } } }
String asString = (String) read(null, f.schema(), in); accessor.set(record, asString == null ? null : newInstanceFromString(accessor.getField().getType(), asString)); return; } catch (Exception e) { Conversion<?> conversion = getData().getConversionByClass( accessor.getField().getType(), logicalType); if (conversion != null) { try { accessor.set(record, convert( readWithoutConversion(oldDatum, f.schema(), in), f.schema(), logicalType, conversion)); } catch (IllegalAccessException e) { readWithoutConversion(oldDatum, f.schema(), in)); return; } catch (IllegalAccessException e) {
private Object readCollection(Collection<Object> c, Schema expectedType, long l, ResolvingDecoder in) throws IOException { LogicalType logicalType = expectedType.getLogicalType(); Conversion<?> conversion = getData().getConversionFor(logicalType); if (logicalType != null && conversion != null) { do { for (int i = 0; i < l; i++) { Object element = readWithConversion( null, expectedType, logicalType, conversion, in); c.add(element); } } while ((l = in.arrayNext()) > 0); } else { do { for (int i = 0; i < l; i++) { Object element = readWithoutConversion(null, expectedType, in); c.add(element); } } while ((l = in.arrayNext()) > 0); } return c; }
long l = in.readArrayStart(); if (l <= 0) { return newArray(old, 0, expected); Object array = newArray(old, (int) l, expected); if (array instanceof Collection) { @SuppressWarnings("unchecked") Collection<Object> c = (Collection<Object>) array; return readCollection(c, expectedType, l, in); } else if (array instanceof Map) { readCollection(c, expectedType, l, in); Map m = (Map)array; for (Object ele: c) { return readJavaArray(array, expectedType, l, in);
@Override protected final void readInternal(Decoder d) throws IOException { for (int i = 0; i < count; i++) { reader.read(null, d); } }
@Override protected void readField(Object record, Field f, Object oldDatum, ResolvingDecoder in, Object state) throws IOException { if (state != null) { FieldAccessor accessor = ((FieldAccessor[]) state)[f.pos()]; if (accessor != null) { if (accessor.supportsIO() && (!Schema.Type.UNION.equals(f.schema().getType()) || accessor.isCustomEncoded())) { accessor.read(record, in); return; } if (accessor.isStringable()) { try { String asString = (String) read(null, f.schema(), in); accessor.set(record, asString == null ? null : newInstanceFromString(accessor.getField().getType(), asString)); return; } catch (Exception e) { throw new AvroRuntimeException("Failed to read Stringable", e); } } } } super.readField(record, f, oldDatum, in, state); } }
@Override @SuppressWarnings("unchecked") protected Object newArray(Object old, int size, Schema schema) { Class collectionClass = ScalaSafeReflectData.getClassProp(schema, ScalaSafeReflectData.CLASS_PROP); Class elementClass = ScalaSafeReflectData.getClassProp(schema, ScalaSafeReflectData.ELEMENT_PROP); if (collectionClass == null && elementClass == null) return super.newArray(old, size, schema); // use specific/generic ScalaSafeReflectData data = ScalaSafeReflectData.getInstance(); if (collectionClass != null && !collectionClass.isArray()) { if (old instanceof Collection) { ((Collection)old).clear(); return old; } if (scala.collection.Iterable.class.isAssignableFrom(collectionClass) || collectionClass.isAssignableFrom(ArrayList.class)) { return Lists.newArrayList(); } return data.newInstance(collectionClass, schema); } if (elementClass == null) { elementClass = data.getClass(schema.getElementType()); } return Array.newInstance(elementClass, size); } }
@Override public T decode(byte[] bytes) { try { BinaryDecoder decoderFromCache = decoders.get(); BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(bytes, decoderFromCache); if (decoderFromCache == null) { decoders.set(decoder); } return reader.read(null, DecoderFactory.get().binaryDecoder(bytes, decoder)); } catch (IOException e) { throw new SchemaSerializationException(e); } }
long l = in.readArrayStart(); if (l <= 0) { return newArray(old, 0, expected); Object array = newArray(old, (int) l, expected); if (array instanceof Collection) { @SuppressWarnings("unchecked") Collection<Object> c = (Collection<Object>) array; return readCollection(c, expectedType, l, in); } else if (array instanceof Map) { readCollection(c, expectedType, l, in); Map m = (Map)array; for (Object ele: c) { return readJavaArray(array, expectedType, l, in);
private Object readCollection(Collection<Object> c, Schema expectedType, long l, ResolvingDecoder in) throws IOException { LogicalType logicalType = expectedType.getLogicalType(); Conversion<?> conversion = getData().getConversionFor(logicalType); if (logicalType != null && conversion != null) { do { for (int i = 0; i < l; i++) { Object element = readWithConversion( null, expectedType, logicalType, conversion, in); c.add(element); } } while ((l = in.arrayNext()) > 0); } else { do { for (int i = 0; i < l; i++) { Object element = readWithoutConversion(null, expectedType, in); c.add(element); } } while ((l = in.arrayNext()) > 0); } return c; }
@Override public DatumReader createDatumReader(Schema writer, Schema reader) { return new ReflectDatumReader(writer, reader, this); }
@Test public void testRead_PojoWithList() throws IOException { PojoWithList pojoWithList = new PojoWithList(); pojoWithList.setId(42); pojoWithList.setRelatedIds(Arrays.asList(1, 2, 3)); byte[] serializedBytes = serializeWithReflectDatumWriter(pojoWithList, PojoWithList.class); Decoder decoder = DecoderFactory.get().binaryDecoder(serializedBytes, null); ReflectDatumReader<PojoWithList> reflectDatumReader = new ReflectDatumReader<>( PojoWithList.class); PojoWithList deserialized = new PojoWithList(); reflectDatumReader.read(deserialized, decoder); assertEquals(pojoWithList, deserialized); }
@Override public T decode(byte[] data) { ByteArrayInputStream bais = new ByteArrayInputStream(data); try { JsonDecoder jsonDecoder = DecoderFactory.get().jsonDecoder(schema, bais); return reader.read(null, jsonDecoder); } catch (IOException e) { throw new IllegalArgumentException(e); } } }
String asString = (String) read(null, f.schema(), in); accessor.set(record, asString == null ? null : newInstanceFromString(accessor.getField().getType(), asString)); return; } catch (Exception e) { Conversion<?> conversion = getData().getConversionByClass( accessor.getField().getType(), logicalType); if (conversion != null) { try { accessor.set(record, convert( readWithoutConversion(oldDatum, f.schema(), in), f.schema(), logicalType, conversion)); } catch (IllegalAccessException e) { readWithoutConversion(oldDatum, f.schema(), in)); return; } catch (IllegalAccessException e) {
@Override /** Called to read an array instance. May be overridden for alternate array * representations.*/ protected Object readArray(Object old, Schema expected, ResolvingDecoder in) throws IOException { Schema expectedType = expected.getElementType(); long l = in.readArrayStart(); if (l <= 0) { return newArray(old, 0, expected); } Object array = newArray(old, (int) l, expected); if (array instanceof Collection) { @SuppressWarnings("unchecked") Collection<Object> c = (Collection<Object>) array; return readCollection(c, expectedType, l, in); } else { return readJavaArray(array, expectedType, l, in); } }
private Object readObjectArray(Object[] array, Schema expectedType, long l, ResolvingDecoder in) throws IOException { LogicalType logicalType = expectedType.getLogicalType(); Conversion<?> conversion = getData().getConversionFor(logicalType); int index = 0; if (logicalType != null && conversion != null) { do { int limit = index + (int) l; while (index < limit) { Object element = readWithConversion( null, expectedType, logicalType, conversion, in); array[index] = element; index++; } } while ((l = in.arrayNext()) > 0); } else { do { int limit = index + (int) l; while (index < limit) { Object element = readWithoutConversion(null, expectedType, in); array[index] = element; index++; } } while ((l = in.arrayNext()) > 0); } return array; }
@Test public void testClassPath() throws Exception { Configuration conf = new Configuration(); ClassLoader loader = conf.getClass().getClassLoader(); AvroSerialization serialization = new AvroSerialization(); serialization.setConf(conf); AvroDeserializer des = (AvroDeserializer)serialization.getDeserializer(AvroKey.class); ReflectData data = (ReflectData)((ReflectDatumReader)des.mAvroDatumReader).getData(); Assert.assertEquals(loader, data.getClassLoader()); }