Changing a Class
Home ] Up ] A Simple Application ] [ Changing a Class ] Specifying an Explicit Version ]

 

 

If you simply serialize out with no special handling, then, by default, ObjectOutputStream will store the fully qualified name of the class being serialized, plus a version number.

This unique version number is computed for the class by applying the Secure Hash Algorithm (SHA) to the name of the class, its interfaces, fields, and methods. If any such changes are made to the class, the version number will change. This means that a class can become incompatible with its serialized versions.

For example, I added an extra field (a phone number) and modified some methods in the Address class:

package serialization;

import java.io.Serializable;

public class Address implements Serializable
{
    public Address(String name, String address)
    {
        this(name, address, null);
    }
    
    public Address(String name, String address, String phone)
    {
        m_name = name;
        m_address = address;
        m_phone = phone;
    }
    
    public String getName()
    {
        return m_name;
    }
    
    public String getAddress()
    {
        return m_address;
    }
    
    public String getPhone()
    {
        return m_phone;
    }
    
    ///// Private data /////
    private String m_name;
    private String m_address;
    private String m_phone;
}

But when I try to serialize an older version back in, it gives me the following error:

java.io.InvalidClassException: serialization.Address; 
      Local class not compatible: stream classdesc serialVersionUID=8364956740597978489 
                                       local class serialVersionUID=2153101615360274995
    at java.io.ObjectStreamClass.setClass(ObjectStreamClass.java:242)
    at java.io.ObjectInputStream.inputClassDescriptor(ObjectInputStream.java:735)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:225)
    at java.io.ObjectInputStream.inputObject(ObjectInputStream.java:933)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:344)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:225)
    at java.util.Hashtable.readObject(Hashtable.java:499)
    at java.io.ObjectInputStream.inputObject(ObjectInputStream.java:1121)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:344)
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:474)
    at java.io.ObjectInputStream.inputObject(ObjectInputStream.java:1122)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:344)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:225)
    at serialization.SerializeInAddressBook.main(SerializeInAddressBook.java:19)
    at symantec.tools.debug.MainThread.run(Agent.java:48)
 
The page was last updated February 19, 2008