Ever had a java.io.NotSerializableException in your code and found it very hard to debug? The JVM stack trace is nearly useless, telling you which code triggered the serialization, but not what it is trying to serialize.
Particularly tedious are HTTP sessions that refuse to serialize. In Wicket we store detached components in the session between requests. If you run a clustered app-server with session replication and add objects to your components that don’t implement Serializable, you’re toast. To avoid you deploying something with this issue and getting fired, we have a setting in development mode that tries to serialize the session on every page request. Unfortunately, although it helps you spot this problem early, it’s lumbered with the same unhelpful java.io.NotSerializableException as everything else in the world.
How do we make these issues easier to debug? Well, I’ve just written an ObjectOutputStream subclass which produces output like this:
java.lang.RuntimeException: Unable to serialize class: com.foo.C
Field hierarchy is:
Class com.foo.A
public com.foo.B myFieldForB
public com.foo.C myFieldForC < ----- field that is not serializable
at DebuggingObjectOutputStream.writeObjectOverride(DebuggingObjectOutputStream.java:105)
at DebuggingObjectOutputStream.writeObjectOverride(DebuggingObjectOutputStream.java:96)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:298)
at DebuggingObjectOutputStream.main(DebuggingObjectOutputStream.java:28)
Caused by: java.io.NotSerializableException: com.foo.C
... 4 more
Continue reading java.io.NotSerializableException in your HttpSession »