Source:
<code>public static GameData loadGame(final InputStream is) throws IOException { checkNotNull(is); final ObjectInputStream input = new ObjectInputStream(new GZIPInputStream(is)); try { final Object version = input.readObject(); if (version instanceof games.strategy.util.Version) { throw new IOException( String.format( "Incompatible engine versions. We are: %s<br/>" + "Trying to load incompatible save game version: %s<br/>" + "To download an older version of TripleA,<br/>" + "please visit: <a href=%s>%s</a>", ClientContext.engineVersion(), ((games.strategy.util.Version) version).getExactVersion(), UrlConstants.OLD_DOWNLOADS_WEBSITE, UrlConstants.OLD_DOWNLOADS_WEBSITE)); } else if (!(version instanceof Version)) { throw new IOException( "Incompatible engine version with save game, " <START> + "unable to determine version of the save game"); <END> } else if (!ClientContext.engineVersion().isCompatibleWithEngineVersion((Version) version)) { throw new IOException( String.format( "Incompatible engine versions. We are: %s<br/>" + "Trying to load game created with: %s<br/>" + "To download the latest version of TripleA,<br/>" + "please visit: <a href=%s>%s</a>", ClientContext.engineVersion(), version, UrlConstants.DOWNLOAD_WEBSITE, UrlConstants.DOWNLOAD_WEBSITE)); } final GameData data = (GameData) input.readObject(); data.postDeSerialize(); loadDelegates(input, data); return data; } catch (final ClassNotFoundException cnfe) { throw new IOException(cnfe.getMessage()); } }</code><technical_language>Do need more this level of detail? avoid keeping a legacy variant of version class for comparison. If ask serialize String Version a more robust approach. If object a string safely assume incompatible in case is a string throw some super fancy analysis algorithm if try change version format in future</technical_language>

Target:
public static GameData loadGame(final InputStream is) throws IOException { checkNotNull(is); final ObjectInputStream input = new ObjectInputStream(new GZIPInputStream(is)); try { final Object version = input.readObject(); if (version instanceof games.strategy.util.Version) { throw new IOException( String.format( "Incompatible engine versions. We are: %s<br>" + "Trying to load incompatible save game version: %s<br>" + "To download an older version of TripleA,<br>" + "please visit: <a href=\"%s\">%s</a>", ClientContext.engineVersion(), ((games.strategy.util.Version) version).getExactVersion(), UrlConstants.OLD_DOWNLOADS_WEBSITE, UrlConstants.OLD_DOWNLOADS_WEBSITE)); } else if (!(version instanceof Version)) { throw new IOException( "Incompatible engine version with save game, " + "unable to determine version of the save game"); } else if (!ClientContext.engineVersion().isCompatibleWithEngineVersion((Version) version)) { throw new IOException( String.format( "Incompatible engine versions. We are: %s<br>" + "Trying to load game created with: %s<br>" + "To download the latest version of TripleA,<br>" + "please visit: <a href=\"%s\">%s</a>", ClientContext.engineVersion(), version, UrlConstants.DOWNLOAD_WEBSITE, UrlConstants.DOWNLOAD_WEBSITE)); } final GameData data = (GameData) input.readObject(); data.postDeSerialize(); loadDelegates(input, data); return data; } catch (final ClassNotFoundException cnfe) { throw new IOException(cnfe.getMessage()); } }