diff --git a/src/Symfony/Component/Serializer/Encoder/ChainEncoder.php b/src/Symfony/Component/Serializer/Encoder/ChainEncoder.php index 73fdd64959..ebb81efb9f 100644 --- a/src/Symfony/Component/Serializer/Encoder/ChainEncoder.php +++ b/src/Symfony/Component/Serializer/Encoder/ChainEncoder.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Serializer\Encoder; use Symfony\Component\Serializer\Encoder\EncoderInterface; +use Symfony\Component\Serializer\Encoder\NormalizationAwareInterface; use Symfony\Component\Serializer\Exception\RuntimeException; /** @@ -53,6 +54,28 @@ class ChainEncoder implements EncoderInterface return true; } + /** + * Checks whether the normalization is needed for the given format. + * + * @param string $format + * + * @return Boolean + */ + public function needsNormalization($format) + { + $encoder = $this->getEncoder($format); + + if (!$encoder instanceof NormalizationAwareInterface) { + return true; + } + + if ($encoder instanceof self) { + return $encoder->needsNormalization($format); + } + + return false; + } + /** * Gets the encoder supporting the format. * @@ -61,7 +84,7 @@ class ChainEncoder implements EncoderInterface * @return EncoderInterface * @throws RuntimeException if no encoder is found */ - public function getEncoder($format) + private function getEncoder($format) { if (isset($this->encoderByFormat[$format]) && isset($this->encoders[$this->encoderByFormat[$format]]) diff --git a/src/Symfony/Component/Serializer/Serializer.php b/src/Symfony/Component/Serializer/Serializer.php index 15587fbf81..f2c513baec 100644 --- a/src/Symfony/Component/Serializer/Serializer.php +++ b/src/Symfony/Component/Serializer/Serializer.php @@ -15,7 +15,6 @@ use Symfony\Component\Serializer\Encoder\ChainDecoder; use Symfony\Component\Serializer\Encoder\ChainEncoder; use Symfony\Component\Serializer\Encoder\EncoderInterface; use Symfony\Component\Serializer\Encoder\DecoderInterface; -use Symfony\Component\Serializer\Encoder\NormalizationAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Exception\RuntimeException; @@ -41,11 +40,8 @@ class Serializer implements SerializerInterface, NormalizerInterface, Denormaliz protected $encoder; protected $decoder; protected $normalizers = array(); - protected $encoders = array(); protected $normalizerCache = array(); protected $denormalizerCache = array(); - protected $encoderByFormat = array(); - protected $decoderByFormat = array(); public function __construct(array $normalizers = array(), array $encoders = array()) { @@ -82,9 +78,7 @@ class Serializer implements SerializerInterface, NormalizerInterface, Denormaliz throw new UnexpectedValueException('Serialization for the format '.$format.' is not supported'); } - $encoder = $this->encoder->getEncoder($format); - - if (!$encoder instanceof NormalizationAwareInterface) { + if ($this->encoder->needsNormalization($format)) { $data = $this->normalize($data, $format); }