From 6fe892f035e1b402b9e4d5bb9dab36cafa5f01b3 Mon Sep 17 00:00:00 2001 From: Mathias Arlaud Date: Thu, 23 Nov 2023 04:53:59 +0100 Subject: [PATCH] [Serializer] Fix XML scalar to object denormalization --- .../Normalizer/AbstractObjectNormalizer.php | 4 +++ .../AbstractObjectNormalizerTest.php | 36 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 4b03fa9ddb11..283ed16910c9 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -369,6 +369,10 @@ public function denormalize($data, string $type, ?string $format = null, array $ return null; } + if (XmlEncoder::FORMAT === $format && !\is_array($data)) { + $data = ['#' => $data]; + } + $allowedAttributes = $this->getAllowedAttributes($type, $context, true); $normalizedData = $this->prepareForDenormalization($data); $extraAttributes = []; diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php index 5243eb2f2ef1..c4e966cb6c4d 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php @@ -17,6 +17,7 @@ use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\PropertyInfo\PropertyInfoExtractor; use Symfony\Component\PropertyInfo\Type; +use Symfony\Component\Serializer\Annotation\SerializedName; use Symfony\Component\Serializer\Exception\ExtraAttributesException; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\LogicException; @@ -30,6 +31,7 @@ use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; +use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; use Symfony\Component\Serializer\Normalizer\CustomNormalizer; @@ -658,6 +660,34 @@ protected function createChildContext(array $parentContext, string $attribute, ? $this->assertFalse($normalizer->childContextCacheKey); } + + public function testDenormalizeXmlScalar() + { + $normalizer = new class () extends AbstractObjectNormalizer + { + public function __construct() + { + parent::__construct(null, new MetadataAwareNameConverter(new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())))); + } + + protected function extractAttributes(object $object, string $format = null, array $context = []): array + { + return []; + } + + protected function getAttributeValue(object $object, string $attribute, string $format = null, array $context = []) + { + return null; + } + + protected function setAttributeValue(object $object, string $attribute, $value, string $format = null, array $context = []) + { + $object->$attribute = $value; + } + }; + + $this->assertSame('scalar', $normalizer->denormalize('scalar', XmlScalarDummy::class, 'xml')->value); + } } class AbstractObjectNormalizerDummy extends AbstractObjectNormalizer @@ -781,6 +811,12 @@ class DummyChild public $bar; } +class XmlScalarDummy +{ + /** @SerializedName("#") */ + public $value; +} + class SerializerCollectionDummy implements SerializerInterface, DenormalizerInterface { private $normalizers;