package games.strategy.engine.data;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
/**
* To maintain == relationships and the singleton nature of many classes in GameData
* we do some work in the ObjectSteam.
* For example, when we serialize a Territory over a GameObjectOutputStream,
* we do not send an instance of Territory, but rather a marker saying that this is the territory,
* and this is its name. When it comes time for a GameObjectOutputStream
* to read the territory on the other side, the territory name is read, and the territory returned
* by the GameObjectInputStream is the territory with that name beloning to the GameData associated
* with the GameObjectInputStream.
* This ensures the state of the territory remains consistent.
*/
public class GameObjectOutputStream extends ObjectOutputStream {
/**
* Creates a new instance of GameObjectOutputStream.
*
* @param output
* output stream
*/
public GameObjectOutputStream(final OutputStream output) throws IOException {
super(output);
enableReplaceObject(true);
}
@Override
protected Object replaceObject(final Object obj) throws IOException {
if (obj instanceof Named) {
final Named named = (Named) obj;
if (GameObjectStreamData.canSerialize(named)) {
return new GameObjectStreamData(named);
}
}
return obj;
}
}