Closed as not planned
Description
Symfony version(s) affected
6.4
Description
The serialize and unserialize for stdClass works because of this code in the class ObjectNormalizer + method extractAttributes
if (\stdClass::class === $object::class) {
return array_keys((array) $object);
}
but this code does not check for classes, that are extending stdClass.
How to reproduce
<?php
declare(strict_types = 1);
use stdClass;
class Contact extends stdClass
{
public string $email = '';
}
$encoders = [new JsonEncoder()];
$classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());
$metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
$extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);
$objectNormalizer = new ObjectNormalizer(
classMetadataFactory: $classMetadataFactory,
nameConverter: $metadataAwareNameConverter,
propertyTypeExtractor: $extractor,
defaultContext: [
AbstractObjectNormalizer::SKIP_UNINITIALIZED_VALUES => true,
AbstractObjectNormalizer::SKIP_NULL_VALUES => true,
AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true,
],
);
$normalizers = [
$objectNormalizer,
];
$serializer = new Serializer($normalizers, $encoders)
$contact = new Contact();
$contact->email = '[email protected]';
$contact->foo = 'bar';
$serializer->serialize($contact, 'json')
Possible Solution
Better would be some additional code like this:
$classParents = class_parents($object::class);
if (false !== $classParents && in_array(\stdClass::class, $classParents)) {
return array_keys((array) $object);
}
Additional Context
No response