How does java serialization deserialize final fields when no default constructor specified?

mdma picture mdma · May 25, 2010 · Viewed 25.6k times · Source

I have an class defining an immutable value type that I now need to serialize. The immutability comes from the final fields which are set in the constructor. I've tried serializing, and it works (surprisingly?) - but I've no idea how.

Here's an example of the class

public class MyValueType implements Serializable
{
    private final int value;

    private transient int derivedValue;

    public MyValueType(int value)
    {
        this.value = value;
        this.derivedValue = derivedValue(value);
    }

    // getters etc...
}

Given that the class doesn't have a no arg constructor, how can it be instantiated and the final field set?

(An aside - I noticed this class particularly because IDEA wasn't generating a "no serialVersionUID" inspection warning for this class, yet successfully generated warnings for other classes that I've just made serializable.)

Answer

Michael Borgwardt picture Michael Borgwardt · May 25, 2010

Deserialization is implemented by the JVM on a level below the basic language constructs. Specifically, it does not call any constructor.