code: def deserialize(self, to_deserialize: PrimitiveJsonType) \
              -> Optional[Union[SerializableType, List[SerializableType]]]:
          
          if to_deserialize is None:
              # Implements #17
              return None
          elif isinstance(to_deserialize, List):
              deserialized = []
              for item in to_deserialize:
                  item_deserialized = self.deserialize(item)
                  deserialized.append(item_deserialized)
              return deserialized
          else:
              mappings_not_set_in_constructor = []    # type: List[PropertyMapping]
  
              init_kwargs = dict()    # type: Dict[str, Any]
              for mapping in self._property_mappings:
                  if mapping.object_constructor_parameter_name is not None:
                      value = mapping.serialized_property_getter(to_deserialize)
                      if not (mapping.optional and value is None):
                          decoded_value = self._deserialize_property_value(value, mapping.deserializer_cls)
                          if isinstance(decoded_value, list):
                              collection = mapping.collection_factory(decoded_value)
                              decoded_value = collection
  
                          argument = mapping.object_constructor_argument_modifier(decoded_value)
                          init_kwargs[mapping.object_constructor_parameter_name] = argument
                  else:
                      mappings_not_set_in_constructor.append(mapping)
  
              decoded = self._deserializable_cls(**init_kwargs)
              assert type(decoded) == self._deserializable_cls
  
              for mapping in mappings_not_set_in_constructor:
                  assert mapping.object_constructor_parameter_name is None
                  if mapping.serialized_property_getter is not None and mapping.object_property_setter is not None:
                      value = mapping.serialized_property_getter(to_deserialize)
                      if not (mapping.optional and value is None):
                          decoded_value = self._deserialize_property_value(value, mapping.deserializer_cls)
                          if isinstance(decoded_value, list):
                              collection = mapping.collection_factory(decoded_value)
                              decoded_value = collection
  
                          mapping.object_property_setter(decoded, decoded_value)
  
              return decoded
docs: Deserializes the given representation of the serialized object.
          :param to_deserialize: the serialized object as a dictionary
          :return: the deserialized object or collection of deserialized objects