/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2000, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.bind.serial;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import com.sleepycat.db.DatabaseException;
import com.sleepycat.util.ClassResolver;
import com.sleepycat.util.RuntimeExceptionWrapper;
/**
* A specialized <code>ObjectInputStream</code> that gets class description
* information from a <code>ClassCatalog</code>. It is used by
* <code>SerialBinding</code>.
*
* <p>This class is used instead of an {@link ObjectInputStream}, which it
* extends, to read an object stream written by the {@link SerialOutput} class.
* For reading objects from a database normally one of the serial binding
* classes is used. {@link SerialInput} is used when an {@link
* ObjectInputStream} is needed along with compact storage. A {@link
* ClassCatalog} must be supplied, however, to stored shared class
* descriptions.</p>
*
* @see <a href="SerialBinding.html#evolution">Class Evolution</a>
*
* @author Mark Hayes
*/
public class SerialInput extends ClassResolver.Stream {
private ClassCatalog classCatalog;
/**
* Creates a serial input stream.
*
* @param in is the input stream from which compact serialized objects will
* be read.
*
* @param classCatalog is the catalog containing the class descriptions
* for the serialized objects.
*/
public SerialInput(InputStream in, ClassCatalog classCatalog)
throws IOException {
this(in, classCatalog, null);
}
/**
* Creates a serial input stream.
*
* @param in is the input stream from which compact serialized objects will
* be read.
*
* @param classCatalog is the catalog containing the class descriptions
* for the serialized objects.
*
* @param classLoader is the class loader to use, or null if a default
* class loader should be used.
*/
public SerialInput(InputStream in,
ClassCatalog classCatalog,
ClassLoader classLoader)
throws IOException {
super(in, classLoader);
this.classCatalog = classCatalog;
}
@Override
protected ObjectStreamClass readClassDescriptor()
throws IOException, ClassNotFoundException {
try {
byte len = readByte();
byte[] id = new byte[len];
readFully(id);
return classCatalog.getClassFormat(id);
} catch (DatabaseException e) {
/*
* Do not throw IOException from here since ObjectOutputStream
* will write the exception to the stream, which causes another
* call here, etc.
*/
throw RuntimeExceptionWrapper.wrapIfNeeded(e);
}
}
}