try {
defaultConstructor = type.getDeclaredConstructor();
if (!defaultConstructor.isAccessible()) {
defaultConstructor.setAccessible(true);
}
final Externalizable externalizable = (Externalizable)defaultConstructor.newInstance();
final CustomObjectInputStream.StreamCallback callback = new CustomObjectInputStream.StreamCallback() {
@Override
public Object readFromStream() {
reader.moveDown();
final Class<?> type = HierarchicalStreams.readClassType(reader, mapper);
final Object streamItem = context.convertAnother(externalizable, type);
reader.moveUp();
return streamItem;
}
@Override
public Map<String, Object> readFieldsFromStream() {
throw new UnsupportedOperationException();
}
@Override
public void defaultReadObject() {
throw new UnsupportedOperationException();
}
@Override
public void registerValidation(final ObjectInputValidation validation, final int priority)
throws NotActiveException {
throw new NotActiveException("stream inactive");
}
@Override
public void close() {
throw new UnsupportedOperationException(
"Objects are not allowed to call ObjectInput.close() from readExternal()");
}
};
{
@SuppressWarnings("resource")
final CustomObjectInputStream objectInput = CustomObjectInputStream.getInstance(context, callback,
classLoaderReference);
externalizable.readExternal(objectInput);
objectInput.popCallback();
}
return externalizable;
} catch (final NoSuchMethodException e) {
throw new ConversionException("Cannot construct " + type.getClass() + ", missing default constructor", e);