Re: [RFC][Discussion] NotSerializable attribute
| From: | Larry Garfield | Date: | Wed, 03 Jan 2024 19:21:22 +0000 |
| Subject: | Re: [RFC][Discussion] NotSerializable attribute | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-122104@lists.php.net to get a copy of this message | ||
On Wed, Jan 3, 2024, at 7:11 AM, Nicolas Grekas wrote:
> Hi Max,
>
> Hi, I'd like to propose a new attribute, #[NotSerializable]. This
>> functionality is already available for internal classes - userspace should
>> benefit from it, too.
>>
>> The RFC: https://wiki.php.net/rfc/not_serializable
>> Proposed implementation:
>> https://github.com/php/php-src/pull/12788
>>
>> Please let me know what you think.
>>
>
> Regarding the inheritance-related behavior ("The non-serializable flag is
> inherited by descendants"), this is very unlike any other attributes, and
> this actively prevents writing a child class that'd make a parent
> serializable if it wants to.
>
> To me, if this is really the behavior we want, then the attribute should be
> replaced by a maker interface.
> Then, a simple "instanceof NotSerializable" would be enough instead of
> adding yet another method to ReflectionClass.
>
> Cheers,
> Nicolas
I think I'm inclined to agree with Nicolas. If the intent here is to impact mainly
serialize()/unserialize(), then a marker interface seems like it has the desired logic "built
in" more than an attribute does. It would only work at the object level, but that seems
correct in this case. For excluding individual properties, __serialize()/__unserialize() already
support that use case. That's one of the main uses for them.
User-space serializers (Crell/Serde, JMS, Symfony, etc.) could easily be modified to honor the
interface as well for external serialization.
--Larry Garfield