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

Semyon Sadetsky semyon.sadetsky at oracle.com
Fri Dec 1 17:58:55 UTC 2017


Thanks. The CSR was created.

--Semyon


On 11/28/2017 12:38 PM, Phil Race wrote:
>
> Ok but you need a CSR first for the API changes .. and so this
> fix cannot be backported.
>
> -phil.
>
> On 11/08/2017 10:35 AM, Semyon Sadetsky wrote:
>> On 11/07/2017 12:54 PM, Phil Race wrote:
>>> > The fields cannot be changed to transient because this would break 
>>> the logic after deserialization of the component.
>>>
>>> Can you explain what logic would be broken since changing these to 
>>> transient looks tempting ..
>>
>> Some evnts would not reach the accessibility listener.
>>
>>>
>>> It can't be a problem for serialisation of actual non-null values 
>>> since demonstrably that
>>> can't ever have worked.
>> They can be involved if the listener is added.
>>>
>>> If there is broken logic for when they are null, what is it ?
>> AccessibleAWTComponentHandler and AccessibleAWTFocusHandler rethrow 
>> events that a necessary for AccessibleAWTComponent listeners. If 
>> those objects are absent the listener will not receive the events. 
>> Since this is a public API it only means that the contract is not met.
>>
>> --Semyon
>>>
>>> -phil.
>>>
>>> On 11/07/2017 10:42 AM, Semyon Sadetsky wrote:
>>>>
>>>>
>>>> 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