8000 [Serializer] Fix deserializing XML Attributes into string properties · symfony/symfony@9a7183e · GitHub
[go: up one dir, main page]

Skip to content

Commit 9a7183e

Browse files
committed
[Serializer] Fix deserializing XML Attributes into string properties
1 parent 88649d9 commit 9a7183e

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,21 @@ private function validateAndDenormalize(array $types, string $currentClass, stri
615615
}
616616
}
617617

618+
if (is_numeric($data) && XmlEncoder::FORMAT === $format) {
619+
// encoder parsed them wrong, so they might need to be transformed back
620+
foreach ($types as $type) {
621+
$builtinType = $type->getBuiltinType();
622+
switch ($builtinType) {
623+
case Type::BUILTIN_TYPE_STRING:
624+
return (string) $data;
625+
case Type::BUILTIN_TYPE_FLOAT:
626+
return (float) $data;
627+
case Type::BUILTIN_TYPE_INT:
628+
return (int) $data;
629+
}
630+
}
631+
}
632+
618633
if ($isNullable) {
619634
return null;
620635
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Symfony\Component\Serializer\Tests\Fixtures\Attributes;
4+
5+
use Symfony\Component\Serializer\Attribute\SerializedName;
6+
7+
class SerializedNameAttributeDummy
8+
{
9+
#[SerializedName('@foo')]
10+
public string $foo;
11+
}

src/Symfony/Component/Serializer/Tests/SerializerTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
3333
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
3434
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
35+
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
3536
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
3637
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
3738
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
@@ -51,6 +52,7 @@
5152
use Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummy;
5253
use Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummyFirstChild;
5354
use Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummySecondChild;
55+
use Symfony\Component\Serializer\Tests\Fixtures\Attributes\SerializedNameAttributeDummy;
5456
use Symfony\Component\Serializer\Tests\Fixtures\DenormalizableDummy;
5557
use Symfony\Component\Serializer\Tests\Fixtures\DummyFirstChildQuux;
5658
use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface;
@@ -766,6 +768,19 @@ public function testDeserializeNullableIntInXml()
766768
$this->assertNull($obj->value);
767769
}
768770

771+
public function testDeserializeIntAsStringPropertyInXML()
772+
{
773+
$classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());
774+
$nameConverter = new MetadataAwareNameConverter($classMetadataFactory);
775+
$extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]);
776+
$serializer = new Serializer([new ObjectNormalizer($classMetadataFactory, $nameConverter, null, $extractor)], ['xml' => new XmlEncoder()]);
777+
778+
$obj = $serializer->deserialize('<?xml version="1.0" encoding="UTF-8"?><NameAttributeDummy foo="123" />', SerializedNameAttributeDummy::class, 'xml');
779+
780+
$this->assertSame('123', $obj->foo);
781+
}
782+
783+
769784
public function testUnionTypeDeserializable()
770785
{
771786
$classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());

0 commit comments

Comments
 (0)
0