<AWT Dev> [10] Review request for 8189201: [macosx] NotSerializableException during JFrame with MenuBar serialization
Semyon Sadetsky
semyon.sadetsky at oracle.com
Wed Nov 8 18:35:15 UTC 2017
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