Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[Serializer] Add support for extending stdClass objects #54613

Closed as not planned
@template-provider

Description

@template-provider

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions