On Wed, 10 Dec 2025 02:36:47 GMT, Sergey Bylokhov <[email protected]> wrote:
> > I dont understand what you are trying to say. WHen JTable is serialized,
> > writeObject also tries to serialize inner GenericEditor class (which is by
> > default Serializable) which it fails to do..I dont see any other way of it
> > being serialized..
>
> writeObject only cares about the objects we pass to it, not the static inner
> classes. The fact that changing the constructor field helps indicates that an
> instance of the GenericEditor class still exists and is being referenced
> somewhere.
>
> What is the full stack trace of the exception?
Caused by: java.io.NotSerializableException: java.lang.reflect.Constructor
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1087)
at
java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1453)
at
java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1410)
at
java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1319)
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at
java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1453)
at
java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1410)
at
java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1319)
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at
java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:327)
at
java.desktop/javax.swing.event.EventListenerList.writeObject(EventListenerList.java:286)
at
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at
java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:946)
at
java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1397)
at
java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1319)
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at
java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1453)
at
java.base/java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:414)
at java.desktop/javax.swing.JComponent.writeObject(JComponent.java:5632)
at
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at
java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:946)
at
java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1397)
at
java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1319)
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at
java.base/java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1262)
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1077)
at
java.base/java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1597)
at
java.base/java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:455)
at java.desktop/java.awt.Container.writeObject(Container.java:3686)
at
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at
java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:946)
at
java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1397)
at
java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1319)
at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at
java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:327)
at
EditingJTableNotSerializable.serialize(EditingJTableNotSerializable.java:45)
at
EditingJTableNotSerializable.lambda$main$0(EditingJTableNotSerializable.java:60)
... 9 more
It seems `JTable.editCellAt()` calls `getCellEditor()` which calls
`getDefaultEditor()` which returns` javax.swing.JTable$GenericEditor` object
which is then used to add a `cellEditorListener ` creating a JTable reference
for the listener by calling
`
editor.addCellEditorListener(this);`
and it is not removed unless `removeEditor()` is called which is not in this
case..
Not sure if this is what holding the reference and causing GenericEditor to get
serialized?
SInce `readObject()` again creates a GenericEditor via `createDefaultEditors()`
the same editor and therefore this listener will not be used after
serialization..
Probably we should remove this listener when we enter serialization for editing
JTable but it seems it throws exception before calling `JTable.writeObject` so
we cannot remove the listener there..so I think present fix is good enough to
make it not serialized..
-------------
PR Comment: https://git.openjdk.org/jdk/pull/28627#issuecomment-3635217678