diff --git a/src/Normalizer/DeterministicNormalizerInterface.php b/src/Normalizer/DeterministicNormalizerInterface.php
new file mode 100644
index 0000000..f40ca7e
--- /dev/null
+++ b/src/Normalizer/DeterministicNormalizerInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Drupal\jsonapi\Normalizer;
+
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+
+/**
+ * An interface for a deterministic normalizer.
+ *
+ * If this interface is implemented, it signifies that the normalizer is valid
+ * for *any* instance of a particular interface or class if it is also valid for
+ * the given format, regardless of the state of the $data or $context arguments.
+ */
+interface DeterministicNormalizerInterface extends NormalizerInterface {}
diff --git a/src/Normalizer/NormalizerBase.php b/src/Normalizer/NormalizerBase.php
index 709739c..b5a642c 100644
--- a/src/Normalizer/NormalizerBase.php
+++ b/src/Normalizer/NormalizerBase.php
@@ -9,7 +9,7 @@ use Drupal\serialization\Normalizer\NormalizerBase as SerializationNormalizerBas
  *
  * @internal
  */
-abstract class NormalizerBase extends SerializationNormalizerBase {
+abstract class NormalizerBase extends SerializationNormalizerBase implements DeterministicNormalizerInterface {
 
   /**
    * {@inheritdoc}
diff --git a/src/Serializer/Serializer.php b/src/Serializer/Serializer.php
index 0ea0442..5437522 100644
--- a/src/Serializer/Serializer.php
+++ b/src/Serializer/Serializer.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\jsonapi\Serializer;
 
+use Drupal\jsonapi\Normalizer\DeterministicNormalizerInterface;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 use Symfony\Component\Serializer\Serializer as SymfonySerializer;
 
@@ -25,6 +26,13 @@ final class Serializer extends SymfonySerializer {
    */
   protected $fallbackNormalizer;
 
+  /**
+   * A multidimensional array associating a data type + format to a normalizer.
+   *
+   * @var array
+   */
+  protected $deterministicNormalizers = [];
+
   /**
    * {@inheritdoc}
    */
@@ -63,6 +71,47 @@ final class Serializer extends SymfonySerializer {
     return parent::normalize($data, $format, $context);
   }
 
+  /**
+   * Decorates \Symfony\Component\Serializer\Serializer::getNormalizer().
+   *
+   * This first checks a cache of normalizers that have implemented
+   * DeterministicNormalizerInterface before iterating over all normalizers and
+   * calling supportsNormalization.
+   *
+   * @param mixed $data
+   *   Data to get the serializer for.
+   * @param string $format
+   *   Format name, present to give the option to normalizers to act differently
+   *   based on formats.
+   * @param array $context
+   *   Options available to the normalizer.
+   *
+   * @return null|\Symfony\Component\Serializer\Normalizer\NormalizerInterface
+   *   An appropriate normalizer or NULL if one does not exist.
+   */
+  private function getNormalizer($data, $format, array $context) {
+    $type = get_class($data);
+    if ($type && isset($this->deterministicNormalizers[$type][$format])) {
+      return $this->deterministicNormalizers[$type][$format];
+    }
+    $normalizer = $this->copiedGetNormalizer($data, $format, $context);
+    if ($type && $normalizer instanceof DeterministicNormalizerInterface) {
+      $this->deterministicNormalizers[$type][$format] = $normalizer;
+    }
+    return $normalizer;
+  }
+
+  /**
+   * Exact copy of \Symfony\Component\Serializer\Serializer::getNormalizer().
+   */
+  private function copiedGetNormalizer($data, $format, array $context) {
+    foreach ($this->normalizers as $normalizer) {
+      if ($normalizer instanceof NormalizerInterface && $normalizer->supportsNormalization($data, $format, $context)) {
+        return $normalizer;
+      }
+    }
+  }
+
   /**
    * {@inheritdoc}
    */
