From 97c5d27c598c678de8d56770e58fafdd05688fd3 Mon Sep 17 00:00:00 2001 From: Ener-Getick Date: Wed, 2 Mar 2016 13:48:01 +0100 Subject: [PATCH] Allow to normalize \Traversable --- .../Component/Serializer/Encoder/XmlEncoder.php | 2 +- .../Serializer/Tests/Encoder/XmlEncoderTest.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php b/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php index d3fe2588ac74..6a2b5cf452dd 100644 --- a/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php +++ b/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php @@ -305,7 +305,7 @@ private function buildXml(\DOMElement $parentNode, $data, $xmlRootNodeName = nul { $append = true; - if (is_array($data) || $data instanceof \Traversable) { + if (is_array($data) || ($data instanceof \Traversable && !$this->serializer->supportsNormalization($data, $this->format))) { foreach ($data as $key => $data) { //Ah this is the magic @ attribute types. if (0 === strpos($key, '@') && is_scalar($data) && $this->isElementNameValid($attributeName = substr($key, 1))) { diff --git a/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php b/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php index bb3e7fb56451..c4697b202a26 100644 --- a/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Serializer\Tests\Encoder; use Symfony\Component\Serializer\Tests\Fixtures\Dummy; +use Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy; use Symfony\Component\Serializer\Tests\Fixtures\ScalarDummy; use Symfony\Component\Serializer\Encoder\XmlEncoder; use Symfony\Component\Serializer\Serializer; @@ -203,6 +204,21 @@ public function testEncodeSerializerXmlRootNodeNameOption() $this->assertEquals($expected, $serializer->serialize($array, 'xml', $options)); } + public function testEncodeTraversableWhenNormalizable() { + $this->encoder = new XmlEncoder(); + $serializer = new Serializer(array(new CustomNormalizer()), array('xml' => new XmlEncoder())); + $this->encoder->setSerializer($serializer); + + $expected = << +normalizedFoonormalizedBar + +XML; + + $this->assertEquals($expected, $serializer->serialize(new NormalizableTraversableDummy(), 'xml')); + + } + public function testDecode() { $source = $this->getXmlSource();