diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 5f2a830268981..3570493e712c6 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -512,6 +512,18 @@ private function validateAndDenormalizeLegacy(array $types, string $currentClass } } + if (is_numeric($data) && XmlEncoder::FORMAT === $format) { + // encoder parsed them wrong, so they might need to be transformed back + switch ($builtinType) { + case LegacyType::BUILTIN_TYPE_STRING: + return (string) $data; + case LegacyType::BUILTIN_TYPE_FLOAT: + return (float) $data; + case LegacyType::BUILTIN_TYPE_INT: + return (int) $data; + } + } + if (null !== $collectionValueType && LegacyType::BUILTIN_TYPE_OBJECT === $collectionValueType->getBuiltinType()) { $builtinType = LegacyType::BUILTIN_TYPE_OBJECT; $class = $collectionValueType->getClassName().'[]'; @@ -748,6 +760,18 @@ private function validateAndDenormalize(Type $type, string $currentClass, string } } + if (is_numeric($data) && XmlEncoder::FORMAT === $format) { + // encoder parsed them wrong, so they might need to be transformed back + switch ($typeIdentifier) { + case TypeIdentifier::STRING: + return (string) $data; + case TypeIdentifier::FLOAT: + return (float) $data; + case TypeIdentifier::INT: + return (int) $data; + } + } + if ($collectionValueType) { try { $collectionValueBaseType = $collectionValueType; diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/SerializedNameAttributeDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/SerializedNameAttributeDummy.php new file mode 100644 index 0000000000000..968ea2bb92968 --- /dev/null +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/SerializedNameAttributeDummy.php @@ -0,0 +1,11 @@ +assertNull($obj->value); } + public function testDeserializeIntAsStringPropertyInXML() + { + $classMetadataFactory = new ClassMetadataFactory(new AttributeLoader()); + $nameConverter = new MetadataAwareNameConverter($classMetadataFactory); + $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]); + $serializer = new Serializer([new ObjectNormalizer($classMetadataFactory, $nameConverter, null, $extractor)], ['xml' => new XmlEncoder()]); + + $obj = $serializer->deserialize('', SerializedNameAttributeDummy::class, 'xml'); + + $this->assertSame('123', $obj->foo); + } + public function testUnionTypeDeserializable() { $classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());