|  | 
| 11 | 11 | 
 | 
| 12 | 12 | namespace Symfony\Component\Serializer\Encoder; | 
| 13 | 13 | 
 | 
|  | 14 | +use Symfony\Component\Serializer\Exception\BadMethodCallException; | 
| 14 | 15 | use Symfony\Component\Serializer\Exception\NotEncodableValueException; | 
| 15 | 16 | use Symfony\Component\Serializer\SerializerAwareInterface; | 
| 16 | 17 | use Symfony\Component\Serializer\SerializerAwareTrait; | 
| @@ -368,7 +369,7 @@ private function buildXml(\DOMNode $parentNode, $data, string $xmlRootNodeName = | 
| 368 | 369 |         $removeEmptyTags = $this->context[self::REMOVE_EMPTY_TAGS] ?? $this->defaultContext[self::REMOVE_EMPTY_TAGS] ?? false; | 
| 369 | 370 |         $encoderIgnoredNodeTypes = $this->context[self::ENCODER_IGNORED_NODE_TYPES] ?? $this->defaultContext[self::ENCODER_IGNORED_NODE_TYPES]; | 
| 370 | 371 | 
 | 
| 371 |  | -        if (\is_array($data) || ($data instanceof \Traversable && !$this->serializer->supportsNormalization($data, $this->format))) { | 
|  | 372 | +        if (\is_array($data) || ($data instanceof \Traversable && (null === $this->serializer || !$this->serializer->supportsNormalization($data, $this->format)))) { | 
| 372 | 373 |             foreach ($data as $key => $data) { | 
| 373 | 374 |                 //Ah this is the magic @ attribute types. | 
| 374 | 375 |                 if (0 === strpos($key, '@') && $this->isElementNameValid($attributeName = substr($key, 1))) { | 
| @@ -407,6 +408,10 @@ private function buildXml(\DOMNode $parentNode, $data, string $xmlRootNodeName = | 
| 407 | 408 |         } | 
| 408 | 409 | 
 | 
| 409 | 410 |         if (\is_object($data)) { | 
|  | 411 | +            if (null === $this->serializer) { | 
|  | 412 | +                throw new BadMethodCallException(sprintf('The serializer needs to be set to allow %s() to be used with object data.', __METHOD__)); | 
|  | 413 | +            } | 
|  | 414 | + | 
| 410 | 415 |             $data = $this->serializer->normalize($data, $this->format, $this->context); | 
| 411 | 416 |             if (null !== $data && !is_scalar($data)) { | 
| 412 | 417 |                 return $this->buildXml($parentNode, $data, $xmlRootNodeName); | 
| @@ -469,6 +474,10 @@ private function selectNodeType(\DOMNode $node, $val): bool | 
| 469 | 474 |         } elseif ($val instanceof \Traversable) { | 
| 470 | 475 |             $this->buildXml($node, $val); | 
| 471 | 476 |         } elseif (\is_object($val)) { | 
|  | 477 | +            if (null === $this->serializer) { | 
|  | 478 | +                throw new BadMethodCallException(sprintf('The serializer needs to be set to allow %s() to be used with object data.', __METHOD__)); | 
|  | 479 | +            } | 
|  | 480 | + | 
| 472 | 481 |             return $this->selectNodeType($node, $this->serializer->normalize($val, $this->format, $this->context)); | 
| 473 | 482 |         } elseif (is_numeric($val)) { | 
| 474 | 483 |             return $this->appendText($node, (string) $val); | 
|  | 
0 commit comments