/**
  * @param string $eventClassName
  * @param string $serialization
  * @return Event
  * @throws EventSourcingException when failed to deserialize
  */
 public function deserialize($eventClassName, $serialization)
 {
     Assert::argumentNotEmpty($eventClassName, 'Event class name is required');
     Assert::argumentClassExists($eventClassName, 'Event class does not exist: %class%');
     Assert::argumentSubclassOf($eventClassName, 'Goodby\\EventSourcing\\Event', 'Event class must be subclass of %parent%');
     $data = json_decode($serialization, true);
     if (json_last_error() != JSON_ERROR_NONE) {
         throw EventSourcingException::failedToDeserializeEvent($this->getLastErrorMessage());
     }
     /** @var $eventClassName Event */
     return $eventClassName::fromContractualData($data);
 }