def serializer_for(self, obj):
<EOL>if obj is None:<EOL><INDENT>return self._null_serializer<EOL><DEDENT>obj_type = type(obj)<EOL>serializer = self.lookup_default_serializer(obj_type, obj)<EOL>if serializer is None:<EOL><INDENT>serializer = self.lookup_custom_serializer(obj_type)<EOL><DEDENT>if serializer is None:<EOL><INDENT>serializer = self.lookup_global_serializer(obj_type)<EOL><DEDENT>if serializer is None:<EOL><INDENT>serializer = self.lookup_python_serializer(obj_type)<EOL><DEDENT>if serializer is None:<EOL><INDENT>raise HazelcastSerializationError("<STR_LIT>" + str(obj_type))<EOL><DEDENT>return serializer<EOL>
Searches for a serializer for the provided object
    Serializers will be  searched in this order;

    1-NULL serializer
    2-Default serializers, like primitives, arrays, string and some default types
    3-Custom registered types by user
    4-Global serializer if registered by user
    4-pickle serialization as a fallback

:param obj: input object
:return: Serializer