package sk.stuba.fiit.perconik.utilities.io; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; import sk.stuba.fiit.perconik.utilities.reflect.resolver.ClassResolver; import static com.google.common.base.Preconditions.checkNotNull; import static sk.stuba.fiit.perconik.utilities.MoreThrowables.initializeSuppressor; public class ClassResolvingObjectInputStream extends ObjectInputStream { private final ClassResolver resolver; public ClassResolvingObjectInputStream(final ClassResolver resolver, final InputStream in) throws IOException { super(in); this.resolver = checkNotNull(resolver); } @Override protected Class<?> resolveClass(final ObjectStreamClass type) throws ClassNotFoundException, IOException { try { return this.resolver.forName(type.getName()); } catch (ClassNotFoundException suppress) { try { return super.resolveClass(type); } catch (ClassNotFoundException failure) { throw initializeSuppressor(failure, suppress); } } } }