Personally, I wouldn't recommend this. The only thing it does is circumvent the built-in Serialization protection mechanism.
(It's somewhat akin to immediately slashing the seatbelt of your new care because someday that belt might keep you from being thrown free of your fire-enveloped car. ;) Scott > -----Original Message----- > From: Eugene Gluzberg [mailto:[EMAIL PROTECTED]] > Sent: Thursday, May 02, 2002 9:52 AM > To: Lucene Developers List > Subject: Re: Serializable RAMDirectory > > > Also add > static final long serialVersionUID = 1; > > if you going to make any class serializable. > > ----- Original Message ----- > From: "Otis Gospodnetic" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Thursday, May 02, 2002 9:03 AM > Subject: Serializable RAMDirectory > > > > Hello, > > > > Is there a reason why we can't make RAMDirectory Serializable? > > It's only a markup interface anyway, and some folks are obviously > > serializing their RAMDirectories. Below is an example of such a > > RAMDirectory and, as you can see, it is nearly identical to > > RAMDirectory - > > identical except for implementing Serializable. Furthermore, > > RAMDirectory > > could not be inherited because it is final, so all code has to be > > duplicated. > > > > Any reasons against making RAMDirectory implement Serializable? > > > > Thanks, > > Otis > > > > --- Karl �ie <[EMAIL PROTECTED]> wrote: > > > that is a great problem with lucene as it uses a FSDir to store it > > > has no > > > sence of transaction handling, for critical indexes i serialize a > > > RAMdir to a > > > database blob, so i can performe a rollback if needed, > but this is a > > > enourmos > > > overhead.... > > > > > > > > > > > import java.io.Serializable; > > > import java.io.IOException; > > > import java.util.Vector; > > > import java.util.Hashtable; > > > import java.util.Enumeration; > > > > > > import org.apache.lucene.store.Directory; > > > import org.apache.lucene.store.InputStream; > > > import org.apache.lucene.store.OutputStream; > > > > > > > > > //------------------------------------------------------------ > -------------- > ------------------------------------ > > > > > > final public class SerializableRAMDirectory extends Directory > > > implements Serializable { > > > > > > Hashtable files = new Hashtable(); > > > > > > public SerializableRAMDirectory() { > > > } > > > > > > /** Returns an array of strings, one for each file in the > directory. > > > */ > > > public final String[] list() { > > > String[] result = new String[files.size()]; > > > int i = 0; > > > Enumeration names = files.keys(); > > > while (names.hasMoreElements()) { > > > result[i++] = (String)names.nextElement(); > > > } > > > return result; > > > } > > > > > > /** Returns true iff the named file exists in this directory. */ > > > public final boolean fileExists(String name) { > > > SerializableRAMFile file = (SerializableRAMFile)files.get(name); > > > return file != null; > > > } > > > > > > /** Returns the time the named file was last modified. */ > > > public final long fileModified(String name) throws IOException { > > > SerializableRAMFile file = (SerializableRAMFile)files.get(name); > > > return file.lastModified; > > > } > > > > > > /** Returns the length in bytes of a file in the directory. */ > > > public final long fileLength(String name) { > > > SerializableRAMFile file = (SerializableRAMFile)files.get(name); > > > return file.length; > > > } > > > > > > /** Removes an existing file in the directory. */ > > > public final void deleteFile(String name) { > > > files.remove(name); > > > } > > > > > > /** Removes an existing file in the directory. */ > > > public final void renameFile(String from, String to) { > > > SerializableRAMFile file = (SerializableRAMFile)files.get(from); > > > files.remove(from); > > > files.put(to, file); > > > } > > > > > > /** Creates a new, empty file in the directory with the > given name. > > > Returns a stream writing this file. */ > > > public final OutputStream createFile(String name) { > > > SerializableRAMFile file = new SerializableRAMFile(); > > > files.put(name, file); > > > return new SerializableRAMOutputStream(file); > > > } > > > > > > /** Returns a stream reading an existing file. */ > > > public final InputStream openFile(String name) { > > > SerializableRAMFile file = (SerializableRAMFile)files.get(name); > > > return new SerializableRAMInputStream(file); > > > } > > > > > > /** Construct a {@link Lock}. > > > * @param name the name of the lock file > > > */ > > > public final Lock makeLock(final String name) { > > > return new Lock() { > > > //-- > > > public boolean obtain() throws IOException { > > > synchronized (files) { > > > if (!fileExists(name)) { > > > createFile(name).close(); > > > return true; > > > } > > > return false; > > > } > > > } > > > public void release() { > > > deleteFile(name); > > > } > > > }; > > > //-- > > > } > > > > > > /** Closes the store to future operations. */ > > > public final void close() { > > > Enumeration fe = files.elements(); > > > while (fe.hasMoreElements()) { > > > ((SerializableRAMFile)fe.nextElement()).buffers.trimToSize(); > > > } > > > } > > > } > > > > > > > > > //------------------------------------------------------------ > -------------- > ------------------------------------ > > > > > > final class SerializableRAMInputStream extends > InputStream implements > > > Cloneable { > > > SerializableRAMFile file; > > > int pointer = 0; > > > > > > public SerializableRAMInputStream(SerializableRAMFile f) { > > > file = f; > > > length = file.length; > > > } > > > > > > /** InputStream methods */ > > > public final void readInternal(byte[] dest, int > destOffset, int len) > > > { > > > int remainder = len; > > > int start = pointer; > > > while (remainder != 0) { > > > int bufferNumber = start/InputStream.BUFFER_SIZE; > > > int bufferOffset = start%InputStream.BUFFER_SIZE; > > > int bytesInBuffer = InputStream.BUFFER_SIZE - bufferOffset; > > > int bytesToCopy = bytesInBuffer >= remainder ? remainder : > > > bytesInBuffer; > > > byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber); > > > System.arraycopy(buffer, bufferOffset, dest, destOffset, > > > bytesToCopy); > > > destOffset += bytesToCopy; > > > start += bytesToCopy; > > > remainder -= bytesToCopy; > > > } > > > pointer += len; > > > } > > > > > > public final void close() { > > > } > > > > > > /** Random-access methods */ > > > public final void seekInternal(long pos) { > > > pointer = (int)pos; > > > } > > > } > > > > > > > > > //------------------------------------------------------------ > -------------- > ------------------------------------ > > > > > > final class SerializableRAMOutputStream extends OutputStream { > > > SerializableRAMFile file; > > > int pointer = 0; > > > > > > public SerializableRAMOutputStream(SerializableRAMFile f) { > > > file = f; > > > } > > > > > > /** output methods: */ > > > public final void flushBuffer(byte[] src, int len) { > > > int bufferNumber = pointer/OutputStream.BUFFER_SIZE; > > > int bufferOffset = pointer%OutputStream.BUFFER_SIZE; > > > int bytesInBuffer = OutputStream.BUFFER_SIZE - bufferOffset; > > > int bytesToCopy = bytesInBuffer >= len ? len : bytesInBuffer; > > > > > > if (bufferNumber == file.buffers.size()) > > > file.buffers.addElement(new byte[OutputStream.BUFFER_SIZE]); > > > > > > byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber); > > > System.arraycopy(src, 0, buffer, bufferOffset, bytesToCopy); > > > > > > if (bytesToCopy < len) { // not all in one buffer > > > int srcOffset = bytesToCopy; > > > bytesToCopy = len - bytesToCopy; // remaining bytes > > > bufferNumber++; > > > if (bufferNumber == file.buffers.size()) > > > file.buffers.addElement(new byte[OutputStream.BUFFER_SIZE]); > > > buffer = (byte[])file.buffers.elementAt(bufferNumber); > > > System.arraycopy(src, srcOffset, buffer, 0, bytesToCopy); > > > } > > > pointer += len; > > > if (pointer > file.length) { > > > file.length = pointer; > > > } > > > file.lastModified = System.currentTimeMillis(); > > > } > > > > > > public final void close() throws IOException { > > > super.close(); > > > } > > > > > > /** Random-access methods */ > > > public final void seek(long pos) throws IOException { > > > super.seek(pos); > > > pointer = (int)pos; > > > } > > > > > > public final long length() throws IOException { > > > return file.length; > > > } > > > > > > } > > > > > > > > > //------------------------------------------------------------ > -------------- > ------------------------------------ > > > > > > final class SerializableRAMFile implements Serializable { > > > Vector buffers = new Vector(); > > > long length; > > > long lastModified = System.currentTimeMillis(); > > > } > > > > > > > > > //------------------------------------------------------------ > -------------- > ------------------------------------ > > > > > > > -- > > > To unsubscribe, e-mail: > > > <mailto:[EMAIL PROTECTED]> > > > For additional commands, e-mail: > > <mailto:[EMAIL PROTECTED]> > > > > > > > > __________________________________________________ > > Do You Yahoo!? > > Yahoo! Health - your guide to health and wellness > > http://health.yahoo.com > > > > -- > > To unsubscribe, e-mail: > <mailto:[EMAIL PROTECTED]> > > For additional commands, e-mail: > <mailto:[EMAIL PROTECTED]> > > > -- > To unsubscribe, e-mail: > <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: > <mailto:[EMAIL PROTECTED]> >
