code: def _fmt_serialization_call(self, data_type, input_value, serialize, depth=0):
          
          data_type, _ = unwrap_nullable(data_type)
          serializer_func = 'serialize' if serialize else 'deserialize'
          serializer_args = []
  
          if is_primitive_type(data_type):
              return input_value
  
          if is_list_type(data_type) or is_map_type(data_type):
              serializer_args.append(('value', input_value))
              elem_data_type = (data_type.value_data_type if
                  is_map_type(data_type) else data_type.data_type)
              serialization_call = self._fmt_serialization_call(
                  elem_data_type, 'elem{}'.format(depth), serialize, depth + 1)
              data_struct_block = '^id(id elem{}) {{ return {}; }}'.format(
                  depth, serialization_call)
              serializer_args.append(('withBlock', data_struct_block))
          elif is_timestamp_type(data_type):
              serializer_args.append(('value', input_value))
              serializer_args.append(('dateFormat',
                                      '@"{}"'.format(data_type.format)))
          else:
              serializer_args.append(('value', input_value))
  
          return '{}'.format(
              fmt_func_call(
                  caller=fmt_serial_obj(data_type),
                  callee=serializer_func,
                  args=fmt_func_args(serializer_args)))
docs: Returns the appropriate serialization / deserialization method
          call for the given data type.