public void readExternal(Object o, ObjectInput in)
        throws IOException, ClassNotFoundException, IllegalAccessException {

        if (o instanceof AbstractInstanciator) {
            AbstractInstanciator<?> instanciator = (AbstractInstanciator<?>) o;
            for (String fieldName : instanciator.getOrderedFieldNames())
                instanciator.put(fieldName, in.readObject());
        } else {
            Converter converter = new DefaultConverter();

            List<Field> fields = findOrderedFields(o.getClass());
            for (Field field : fields) {
                field.setAccessible(true);
                Object value = converter.convertForDeserialization(in.readObject(), field.getType());
                field.set(o, value);
            }
        }
    }