Draft Object Serialization Specification for records - construction/destruction
Peter Levart
peter.levart at gmail.com
Mon Oct 7 14:21:44 UTC 2019
On 10/7/19 3:31 PM, Chris Hegarty wrote:
> Peter,
>
>> On 6 Oct 2019, at 23:07, Peter Levart <peter.levart at gmail.com> wrote:
>>
>> On Sunday, October 6, 2019 11:38:42 PM CEST Peter Levart wrote:
>>> Hi Chris,
>>>
>>> I think that if stream values deserialize into a record through its public
>>> API (the canonical constructor which can be customized), then record
>>> components that are serailzed must also be obtained from a record via its
>>> public API (the accessors which can also be customized).
>>>
>> ...above discussion also extends to the ObjectOutputStream.writeObject method
>> description that is currently written as:
>>
>> """If the object is a record object, the ObjectStreamClass for the class of
>> the record object is written by recursively calling writeObject. It will
>> appear in the stream only the first time it is referenced. A handle is
>> assigned for the record object.
>>
>> The components of the record object are written to the stream.
>>
>> a. If the record object is serializable or externalizable, the record
>> components are written, as if by invoking the `defaultWriteObject`
>> method.
>>
>> b. If the object is neither serializable or externalizable, the
>> `NotSerializableException` is thrown.
>>
>> The writeObject method then returns.
>> """
>>
>> So instead of "as if by invoking the `defaultWriteObject`, here you might want
>> to describe how component values are obtained, etc.
> Answered in another email.
>
>> But I wanted to comment on another thing here: "a. If the record object is
>> serializable or externalizable, ..."
>>
>> How could record be Externalizable? It would have to implement
>> writeExternal(ObjectOutput). No big deal. It would also have to have a public
>> no-arg constructor. No big deal. It would have to implement
>> readExternal(ObjectInput). Wait! How could a record type effectively implement
>> readExternal if all record fields are final?
> Yeah, Externalizable and records are just at odds. The only possible useful externalizable record is a record with no components! Externalizable is a bit of a wart here, but was included for consistency.
>
>> Externalizable and records don't play together well, I think. If a record type
>> wishes to fully customize serialization format it still can designate a
>> serialization proxy (via writeReplace()) which can be an instance of a normal
>> Externalizable class for example.
>>
> I agree, writeReplace is the correct escape hatch for folk that want something other than the default scheme. The is why it is there.
>
> I’m not opposed to dropping support for Externalizable. Is that the suggestion? What should happen if one writes `record R (int x, int y) implements Externalizable { … }` - a warning or not? maybe an error during serializing / deserializing??
I suggest nothing. He will quickly realize that he can't meaningfully
implement readExternal method and abandon the attempt. I don't even
think there has to be special code for instances that implement
Externalizable if they are records.
Regards, Peter
More information about the amber-spec-experts
mailing list