package org.prevayler.foundation.serialization;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
/**
* A strategy for writing objects to and reading objects from streams. Implementations <b>must</b> be safe for
* concurrent use by multiple threads.
* <p>
* If an implementation will be used for snapshots, it must be able to write and read the prevalent system it will
* be used with, but does not need to be able to write or read any other objects. If an implementation will be used
* for journals, it must be able to write and read any transactions it will be used with, but does not need to be
* able to write or read any other objects.
*/
public interface Serializer {
/**
* Write an object to a stream. An implementation must ensure that the object is written
* completely before returning. An implementation is free to flush or close the given stream
* as it sees fit, but is not required to do either. An implementation can expect that the
* stream is already buffered, so additional buffering is not required for performance.
*/
public void writeObject(OutputStream stream, Object object) throws IOException;
/**
* Read an object from a stream. An implementation is free to close the given stream
* as it sees fit, but is not required to do so. An implementation can expect that the
* stream is already buffered, so additional buffering is not required for performance.
*/
public Object readObject(InputStream stream) throws IOException, ClassNotFoundException;
}