public Object unmarshal()

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