Skip to content

Serializer not fill properties on class which extended from abstract class. #27641

Closed
@voodoo-dn

Description

@voodoo-dn

Symfony version(s) affected: v4.1.0

Description
Serializer on deserialization fill only properties on abstract class, not on concrete class.
I have AbstractPrizeClass which extended by MoneyPrize and PointPrize.

App\Domain\Entity\Prize\AbstractPrize:
    attributes:
        id:
            groups: ['admin_read']
        place:
            groups: ['admin_read', 'admin_write']
    discriminator_map:
        type_property: 'discriminator'
        mapping:
            money: 'App\Domain\Entity\Prize\Money\MoneyPrize'
            points: 'App\Domain\Entity\Prize\PointPrize'

App\Domain\Entity\Prize\Money\MoneyPrize:
    attributes:
        wager:
            groups: ['admin_read', 'admin_write']
        amounts:
            groups: ['frontapi', 'admin_read', 'admin_write']

App\Domain\Entity\Prize\Money\Amount:
    attributes:
        amount:
            groups: ['frontapi', 'admin_read', 'admin_write']
        currency:
            groups: ['frontapi', 'admin_read', 'admin_write']

App\Domain\Entity\Prize\PointPrize:
    attributes:
        count:
            groups: ['frontapi', 'admin_read', 'admin_write']

AbstractPrize have place property. MoneyPrize have amounts, etc. properties. PointPrize have count property.

If I try desirialize next json: {"discriminator": "points", "count": 1000 }, serializer return PointPrize only with place property filled, other properties are null.

How to reproduce

App\A:
    attributes:
        a:
            groups: ['test']
    discriminator_map:
        type_property: 'discriminator'
        mapping:
            b: 'App\B'

App\B:
    attributes:
        b:
            groups: ['test']
abstract class A { private $a; public getA() { return $a; } public setA($a) { $this->a = $a; }}

class B extends A { private $b; public getB() { return $b; } public setB($b) { $this->b = $b; }}

$b = $container->get('serializer')->deserialize('{"discriminator": "b", "a": 1000, "b": 2000 }', App\A::class, 'json');

$b->getA() === 1000
$b->getB() === null

Sorry for my english =|

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