1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
diff --git a/jsonpickle/pickler.py b/jsonpickle/pickler.py
index 3d391cb..2103e46 100644
--- a/jsonpickle/pickler.py
+++ b/jsonpickle/pickler.py
@@ -476,8 +476,12 @@ def _flatten_obj_instance(self, obj):
# Support objects with __getstate__(); this ensures that
# both __setstate__() and __getstate__() are implemented
- has_getstate = hasattr(obj, '__getstate__')
+ has_own_getstate = (
+ hasattr(type(obj), '__getstate__')
+ and type(obj).__getstate__ is not getattr(object, '__getstate__', None)
+ )
# not using has_method since __getstate__() is handled separately below
+ # Note: on Python 3.11+, all objects have __getstate__.
if has_class:
cls = obj.__class__
@@ -549,7 +553,7 @@ def _flatten_obj_instance(self, obj):
# check that getstate/setstate is sane
if not (
state
- and hasattr(obj, '__getstate__')
+ and has_own_getstate
and not hasattr(obj, '__setstate__')
and not isinstance(obj, dict)
):
@@ -581,7 +585,7 @@ def _flatten_obj_instance(self, obj):
if has_getinitargs:
data[tags.INITARGS] = self._flatten(obj.__getinitargs__())
- if has_getstate:
+ if has_own_getstate:
try:
state = obj.__getstate__()
except TypeError:
@@ -590,7 +594,8 @@ def _flatten_obj_instance(self, obj):
self._pickle_warning(obj)
return None
else:
- return self._getstate(state, data)
+ if state:
+ return self._getstate(state, data)
if util.is_module(obj):
if self.unpicklable:
|