class_docstr: Serialized experiment state cache.
  
  ODB with git SHAs as keys. Objects can be either SerializableExp or
  SerializableError.
code: def get(
      self, rev: str
  ) -> Optional[Union[SerializableExp, SerializableError]]:
      obj = self.odb.get(rev)
      try:
          with obj.fs.open(obj.path, "rb") as fobj:
              data = fobj.read()
      except FileNotFoundError:
          logger.trace("ExpCache: cache miss '%s'", rev[:7])
          return None
      for typ in (SerializableExp, SerializableError):
          try:
              exp = typ.from_bytes(data)  # type: ignore[attr-defined]
              logger.trace("ExpCache: cache load '%s'", rev[:7])
              return exp
          except DeserializeError:
              continue
      logger.debug("ExpCache: unknown object type for '%s'", rev)
      return None
  
file_path: dvc/dvc/repo/experiments/cache.py
imports: import os
  from typing import TYPE_CHECKING, Optional, Union
  from dvc.fs import localfs
  from dvc.log import logger
  from dvc_objects.db import ObjectDB
  from .serialize import DeserializeError, SerializableError, SerializableExp
  from .utils import EXEC_TMP_DIR
label_desc: Use image node_id 4 for calling the ExpCache obj's underlying member method code with example usage: obj.get(rev) and returns: None, None, exp