<AWT Dev> [10] Review request for 8189201: [macosx] NotSerializableException during JFrame with MenuBar serialization

Semyon Sadetsky semyon.sadetsky at oracle.com
Tue Nov 7 18:42:03 UTC 2017

On 11/07/2017 10:21 AM, Sergey Bylokhov wrote:
> On 07/11/2017 08:48, Semyon Sadetsky wrote:
>>> But from the other point of view all our listeners like 
>>> "componentListener", "keyListener" etc are transient and have some 
>>> special steps in Component.writeObject().
>> Yes, it may be necessary to to do something with 
>> propertyListenersCount in writeObject() as well. But this may change 
>> the format compatibility. I have created a separate bug to 
>> investigate this: https://bugs.openjdk.java.net/browse/JDK-8190867
> But it does not explain why other containers for listeners marked as 
> transient. I guess the reason is in this part of spec in 
> Component.writeObject():
>      * Writes default serializable fields to stream.  Writes
>      * a variety of serializable listeners as optional data.
>      * The non-serializable listeners are detected and
>      * no attempt is made to serialize them.
> This is why all of them marked as transient and during serialization 
> we iterates over them and save only listeners which implements 
> Serializable interface.
I did get this. This spec is unrelated to the current issue. The current 
issue is very simple:

AccessibleAWTComponent class is Serializable but its fields 
accessibleAWTComponentHandler and  accessibleAWTFocusHandler are not.

This violates the Java serialization policy and causes exception in JDK 
code. The proposed fix eliminates this issue. The fields cannot be 
changed to transient because this would break the logic after 
deserialization of the component.
>> --Semyon
>>> On 31/10/2017 09:05, Semyon Sadetsky wrote:
>>>> The updated webrev: 
>>>> http://cr.openjdk.java.net/~ssadetsky/8189201/webrev.02/
>>>> On 10/23/2017 01:54 PM, Semyon Sadetsky wrote:
>>>>> Actually ScreenMenu is fully removed in uninstallUI() (line 54 of 
>>>>> AquaMenuBarUI), so there is no need to make its property listener 
>>>>> Serializable, please, ignore the change in 
>>>>> ScreenMenuPropertyListener.
>>>>> --Semyon
>>>>> On 10/23/2017 01:25 PM, Semyon Sadetsky wrote:
>>>>>> On 10/23/2017 12:58 PM, Sergey Bylokhov wrote:
>>>>>>> On 23/10/2017 12:41, Semyon Sadetsky wrote:
>>>>>>>>> The AquaMenuBarBorder class is L&F specific, and it should not 
>>>>>>>>> be serialized/deserialized. Such information(plus l&f client 
>>>>>>>>> properties/listeners/etc) should be removed from the component 
>>>>>>>>> before serialization. And during deserialization the L&F of 
>>>>>>>>> the target system should be applied.
>>>>>>>> That is valid concern. The webrev is updated 
>>>>>>>> http://cr.openjdk.java.net/~ssadetsky/8189201/webrev.01/
>>>>>>> The same is applicable to ScreenMenuPropertyListener as well 
>>>>>>> because it is also L&F specific.
>>>>>>> I assume that the changes in AccessibleAWTComponentHandler/etc 
>>>>>>> are necessary because somecode installs the listeners on the 
>>>>>>> components, since the bug is not reproduced in Metal I assume 
>>>>>>> that this listeners are installed by Aqua, in this case these 
>>>>>>> listeners also should be removed from the component before 
>>>>>>> serialization.
>>>>>> ScreenMenu is not a Swing component.
>>>>>> --Semyon

More information about the awt-dev mailing list