jsonpickle icon indicating copy to clipboard operation
jsonpickle copied to clipboard

AttributeError: 'Int64' object attribute '_type_marker' is read-only

Open DeveloperAnonymous opened this issue 1 year ago • 2 comments

Hello, this error happens on version 3.0.4, I reverted back to 3.0.3 and the error has stopped.

Python Version: Python 3.12.3 Jsonpickle Version: 3.0.4 OS: Docker, python:3-slim (Debian GNU/Linux 12) Code: https://github.com/BattleBanana/BattleBanana/blob/master/dueutil/game/players.py#L516-L523 Stacktrace:

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/discord/client.py", line 441, in _run_event
    await coro(*args, **kwargs)
  File "/usr/src/app/run.py", line 338, in on_message
    await events.on_message_event(message)
  File "/usr/src/app/dueutil/events.py", line 100, in on_message_event
    await message_event(ctx)
  File "/usr/src/app/dueutil/events.py", line 17, in __call__
    if await listener(ctx):
       ^^^^^^^^^^^^^^^^^^^
  File "/usr/src/app/dueutil/game/game.py", line 264, in on_message
    player = players.find_player(message.author.id)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/app/dueutil/game/players.py", line 507, in find_player
    elif load_player(user_id):
         ^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/app/dueutil/game/players.py", line 521, in load_player
    loaded_player = jsonpickle.decode(player_data)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 98, in decode
    return context.restore(data, reset=reset, classes=classes)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 378, in restore
    value = self._restore(obj)
            ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
    return restore(obj)
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 797, in _restore_object
    return self._restore_object_instance(obj, cls, class_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 772, in _restore_object_instance
    instance = self._restore_object_instance_variables(obj, instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 718, in _restore_object_instance_variables
    instance = self._restore_state(obj, instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 677, in _restore_state
    state = self._restore(obj[tags.STATE])
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
    return restore(obj)
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 849, in _restore_dict
    data[k] = self._restore(v)
              ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
    return restore(obj)
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 443, in _restore_list
    children = [self._restore(v) for v in obj]
                ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
    return restore(obj)
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 797, in _restore_object
    return self._restore_object_instance(obj, cls, class_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 772, in _restore_object_instance
    instance = self._restore_object_instance_variables(obj, instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 718, in _restore_object_instance_variables
    instance = self._restore_state(obj, instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 677, in _restore_state
    state = self._restore(obj[tags.STATE])
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
    return restore(obj)
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 849, in _restore_dict
    data[k] = self._restore(v)
              ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
    return restore(obj)
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 797, in _restore_object
    return self._restore_object_instance(obj, cls, class_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 772, in _restore_object_instance
    instance = self._restore_object_instance_variables(obj, instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 706, in _restore_object_instance_variables
    instance = self._restore_from_dict(obj, instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 658, in _restore_from_dict
    raise e
  File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 637, in _restore_from_dict
    setattr(instance, k, value)
AttributeError: 'Int64' object attribute '_type_marker' is read-only

DeveloperAnonymous avatar May 29 '24 23:05 DeveloperAnonymous

Thanks for the heads-up. Can you provide a minimally reproducible example? Ideally it'd be something we can add to our test suite to avoid breaking this in the future as well.

davvid avatar Jun 01 '24 06:06 davvid

import jsonpickle
unpickled = jsonpickle.decode("""{
    "py/object": "bson.int64.Int64",
    "py/newargs": { "py/tuple": [123456789012345678] },
    "_type_marker": 18,
    "as_integer_ratio": {
        "py/function": "bson.int64.Int64.as_integer_ratio"
    },
    "bit_count": { "py/function": "bson.int64.Int64.bit_count" },
    "bit_length": { "py/function": "bson.int64.Int64.bit_length" },
    "conjugate": { "py/function": "bson.int64.Int64.conjugate" },
    "denominator": 1,
    "from_bytes": { "py/function": "builtins.Int64.from_bytes" },
    "imag": 0,
    "numerator": 123456789012345678,
    "real": 123456789012345678,
    "to_bytes": { "py/function": "bson.int64.Int64.to_bytes" }
    }
""")

DeveloperAnonymous avatar Jun 01 '24 17:06 DeveloperAnonymous