Folks, In 1.3 we worked hard this week to improve the diagnostics of Serialization errors. I know from experience that when tracking down non-serializable classes/ fields, the JDK's default serialization isn't very helpful. Especially when you work a lot with inner classes etc.
https://issues.apache.org/jira/browse/WICKET-265 is the issue we use for tracking our improvements. I think we've got it pinned down pretty well now. You'll get stacktraces like: wicket.util.io.SerializableChecker$WicketNotSerializableException: Unable to serialize class: ts4.component.cwt.CwtComponent Field hierarchy is: 1 [class=ts4.web.wicket.page.workspace.ComponentPage, path=1] private java.lang.Object wicket.MarkupContainer.children [class=[Lwicket.Component;] private java.lang.Object wicket.MarkupContainer.children[1] [class=ts4.web.wicket.page.workspace.TopBarPanel, path=1:top-bar] private java.lang.Object wicket.MarkupContainer.children [class=[Lwicket.Component;] private java.lang.Object wicket.MarkupContainer.children[0] [class=wicket.markup.html.WebMarkupContainer, path=1:top-bar:holder] private java.lang.Object wicket.MarkupContainer.children [class=ts4.web.wicket.page.workspace.ComponentBreadCrumbs, path=1:top-bar:holder:crumbs] private final ts4.component.WorkspaceComponent ts4.web.wicket.page.workspace.ComponentBreadCrumbs.component [class=ts4.component.cwt.CwtComponent] <----- field that is not serializable at wicket.util.io.SerializableChecker.check(SerializableChecker.java:334) at wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:616) at wicket.util.io.SerializableChecker.check(SerializableChecker.java:530) at wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:616) at wicket.util.io.SerializableChecker.check(SerializableChecker.java:530) at wicket.util.io.SerializableChecker.check(SerializableChecker.java:368) at wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:616) at wicket.util.io.SerializableChecker.check(SerializableChecker.java:530) at wicket.util.io.SerializableChecker.check(SerializableChecker.java:368) at wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:616) at wicket.util.io.SerializableChecker.check(SerializableChecker.java:530) at wicket.util.io.SerializableChecker.writeObjectOverride(SerializableChecker.java:684) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:287) at wicket.util.lang.Objects.objectToByteArray(Objects.java:1056) at wicket.protocol.http.FilePageStore.serializePage(FilePageStore.java:414) at wicket.protocol.http.FilePageStore.access$4(FilePageStore.java:407) at wicket.protocol.http.FilePageStore$PageSavingThread.run(FilePageStore.java:601) at java.lang.Thread.run(Thread.java:613) Caused by: java.io.NotSerializableException: ts4.component.cwt.CwtComponent at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1341) ... I hope this will be a useful improvement for all of you working on 1.3. If you have improvements/ patches, they are as always welcome. You can find the whole deal in wicket.util.io.SerializableChecker. I hope to do a port to 2.0 later this week. Eelco
