transientなフィールドがデシリアライズした時にnullになるのを避けるには、readObjectメソッドの中でフィールドを初期化すればいい。
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
handler = new Handler();
}
readObjectはSerializableで定義されてないし、privateだけどデシリアライズ時に呼ばれる。 ランタイムがリフレクションを使って呼び出してるんだろうけど、Javaでこんなことやるなんて珍しいな。。
参考: