Java.Core.Serialization

How does Serialization work?

Step 1: Implement Serializable

For a class to support serialization, it must implement the java.io.Serializable interface.

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;

    // constructor, getters, setters
}

Step 2: Use ObjectOutputStream to Serialize

You can serialize an object like this:

Person person = new Person("John", 30);

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
    oos.writeObject(person);
}

This writes the object’s state into a file called person.ser.


Step 3: Use ObjectInputStream to Deserialize

Later, you can read the object back:

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
    Person person = (Person) ois.readObject();
    System.out.println(person.getName() + " is " + person.getAge());
}

🧩 Important: What gets serialized?

  • All non-transient fields get serialized.
  • static fields are NOT serialized (because they belong to the class, not the object).
  • Transient fields are skipped (that’s the point of transient).

🔥 What is serialVersionUID and why is it important for versioning?

serialVersionUID is a special constant that acts like a version number for the class. It helps during deserialization.

private static final long serialVersionUID = 1L;

Why do you need it?

Serialization saves the exact structure of a class. When you deserialize, Java compares the saved version (from the file) with the current class version.

  • If they match (same serialVersionUID), deserialization succeeds.
  • If they don’t match, deserialization fails with an InvalidClassException.

What happens if you don’t define serialVersionUID?

Java will generate one automatically based on the class structure (fields, methods, etc.). This is risky because:

  • Even a tiny change (like renaming a field) will generate a different serialVersionUID.
  • This makes older serialized objects incompatible with newer versions of the class.

Recommended Practice

  • Always explicitly define serialVersionUID if you expect the class to be serialized and deserialized in future versions of your app.
  • This gives you control over versioning and lets you evolve the class safely.

Example with serialVersionUID

public class Person implements Serializable {
    private static final long serialVersionUID = 1L; // fixed version
    private String name;
    private int age;

    // constructor, getters, setters
}

Summary Table

TermMeaning
SerializationConvert object → byte stream
DeserializationConvert byte stream → object
serialVersionUIDClass version identifier to handle compatibility
transientSkip field during serialization

Final Thought: What happens if you change a class?

If you:

  • Add a new field (like address), old serialized files won’t have that field.
  • If you set serialVersionUID correctly, you can manually handle the missing data (provide a default value in readObject() method if needed).
This entry was posted in Без рубрики. Bookmark the permalink.