 <p>The answer is <strong>no</strong>, by default object identity is not preserved via serialization if you are considering 2 separate serializations of a given object/graph. For example, if a I serialize an object over the wire (perhaps I send it from a client to a server via RMI), and then do it again (in separate RMI calls), then the 2 deserialized objects on the server will <em>not</em> be ==.</p> <p>However, in a "single serialization" e.g. a single client-server message which is a graph containing the same object multiple times then upon deserialization, identity <em>is</em> preserved. </p> <p>For the first case, you can, however, provide an implementation of the <a href="http://docs.oracle.com/javase/7/docs/platform/serialization/spec/input.html#5903" rel="nofollow noreferrer"><code>readResolve</code></a> method in order to ensure that the correct instance is returned (e.g. in the <em>typesafe enum</em> pattern). <code>readResolve</code> is a private method which will be called by the JVM on a de-serialized Java object, giving the object the chance to return a different instance. For example, this is how the <code>TimeUnit</code> <code>enum</code> may have been implemented before <code>enum</code>'s were added to the language:</p> <pre><code>public class TimeUnit extends Serializable { private int id; public TimeUnit(int i) { id = i; } public static TimeUnit SECONDS = new TimeUnit(0); //Implement method and return the relevant static Instance private Object readResolve() throws ObjectStreamException { if (id == 0) return SECONDS; else return this; } } </code></pre> <p>.</p>