in xstream/src/java/com/thoughtworks/xstream/converters/reflection/ExternalizableConverter.java [147:205]
public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {
final Class<?> type = context.getRequiredType();
final Constructor<?> defaultConstructor;
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 serializationMembers.callReadResolve(externalizable);
} catch (final NoSuchMethodException e) {
throw new ConversionException("Missing default constructor of type", e);
} catch (final InvocationTargetException | InstantiationException | ClassNotFoundException e) {
throw new ConversionException("Cannot construct type", e);
} catch (final IllegalAccessException e) {
throw new ObjectAccessException("Cannot construct type", e);
} catch (final IOException e) {
throw new StreamException("Cannot externalize " + type.getClass(), e);
}
}