{"record":{"id":"8d3fde0275d14e82","repo":"pypa/pip","slug":"cannot-serialize-obj-r","errorCode":null,"errorMessage":"Cannot serialize {obj!r}","messagePattern":"Cannot serialize (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/pip/_vendor/msgpack/fallback.py","lineNumber":804,"sourceCode":"                    self._pack(obj[i], nest_limit - 1)\n                return\n            if check(obj, dict):\n                return self._pack_map_pairs(len(obj), obj.items(), nest_limit - 1)\n\n            if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None:\n                obj = Timestamp.from_datetime(obj)\n                default_used = 1\n                continue\n\n            if not default_used and self._default is not None:\n                obj = self._default(obj)\n                default_used = 1\n                continue\n\n            if self._datetime and check(obj, _DateTime):\n                raise ValueError(f\"Cannot serialize {obj!r} where tzinfo=None\")\n\n            raise TypeError(f\"Cannot serialize {obj!r}\")\n\n    def pack(self, obj):\n        try:\n            self._pack(obj)\n        except:\n            self._buffer = BytesIO()  # force reset\n            raise\n        if self._autoreset:\n            ret = self._buffer.getvalue()\n            self._buffer = BytesIO()\n            return ret\n\n    def pack_map_pairs(self, pairs):\n        self._pack_map_pairs(len(pairs), pairs)\n        if self._autoreset:\n            ret = self._buffer.getvalue()\n            self._buffer = BytesIO()\n            return ret","sourceCodeStart":786,"sourceCodeEnd":822,"githubUrl":"https://github.com/pypa/pip/blob/f399c3718970b1b0e2478dac5296eb62679a9b86/src/pip/_vendor/msgpack/fallback.py#L786-L822","documentation":"Raised by msgpack's pure-Python Packer._pack as the final fallthrough when the object does not match any serializable type (None, bool, int, float, bytes, bytearray, str, memoryview, ExtType, Timestamp, list, tuple, dict, or timezone-aware datetime) AND either no default callback was provided or the default callback was already invoked once and still returned an unserializable value. This is a TypeError, meaning the input type is fundamentally unsupported.","triggerScenarios":"Packing a custom class instance, set, frozenset, complex, range, or any other object not in msgpack's native type table without providing a default serializer. Also raised when the default callback returns a value that is itself unserializable.","commonSituations":"Serializing ORM model instances, dataclasses, or custom objects without a default function; packing a set instead of a list; nested custom objects where default only handles the top level.","solutions":["Provide a default callback to Packer(default=my_func) or packb(obj, default=my_func) that converts unsupported types to dict/list/primitives.","Convert sets to lists and custom objects to dicts before packing.","Use recursion-safe default handlers that handle each custom type, since default is only called once per object.","For dataclasses, use dataclasses.asdict() before packing."],"exampleFix":"# before\npacker = msgpack.Packer()\npacker.pack({1, 2, 3})  # set — raises TypeError\n\n# after — provide a default handler\ndef default(obj):\n    if isinstance(obj, set):\n        return list(obj)\n    raise TypeError(f'Cannot serialize {obj!r}')\npacker = msgpack.Packer(default=default)\npacker.pack({1, 2, 3})","handlingStrategy":"try-catch","validationCode":"import msgpack\nfrom datetime import datetime, timezone\n\ndef default_serializer(obj):\n    if isinstance(obj, set):\n        return list(obj)\n    if hasattr(obj, '__dict__'):\n        return obj.__dict__\n    raise TypeError(f'Cannot serialize {type(obj).__name__}')\n\npacker = msgpack.Packer(default=default_serializer)","typeGuard":"MSGPACK_TYPES = (type(None), bool, int, float, bytes, bytearray, str, memoryview, list, tuple, dict)\n\ndef is_msgpack_native(obj) -> bool:\n    return isinstance(obj, MSGPACK_TYPES)","tryCatchPattern":"try:\n    packed = packer.pack(obj)\nexcept TypeError as e:\n    if 'Cannot serialize' in str(e):\n        packed = packer.pack(str(obj))  # or convert to dict\n    else:\n        raise","preventionTips":["Always provide a default callback when packing arbitrary objects.","Convert custom types to dicts/lists at the data boundary.","Use dataclasses.asdict() for dataclass instances.","Test serialization of all object types in your data model."],"tags":["msgpack","serialization","type-error","custom-types"],"backgroundTag":null,"analyzedSha":"f399c3718970b1b0e2478dac5296eb62679a9b86","analyzedAt":"2026-08-08T23:01:42.227Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}