Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Как серелизовать произвольный объект в строку?

#python #python_3x #сериализация


У меня есть произвольный объект, например упрощенно для класса:

class Attribute:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def calc():
        return self.x + self.y


создаю объект:

attr = Attribute(1, 1)


Я хочу сохранить этот объект(attr) в строку и потом при необходимости его оттуда
загрузить. Я пытался использовать модуль pickle, но не осилил.

import pickle
pickled = pickle.dumps(attr)
spickled = str(pickled)

unpickled = pickle.loads(spickled)


Привело к ошибке:

TypeError: a bytes-like object is required, not 'str'


str(pickled) потому что на самом деле я должен сохранить свой объект в json как строку
и потом считать оттуда при другом запуске.

Собственно вопрос, как мне сохранить мой объект в json и потом его прочитать? Человекочитаемость
не обязательно.
    


Ответы

Ответ 1



import pickle import base64 pickled = pickle.dumps(attr) spickled = base64.standard_b64encode(pickled) unpickled = pickle.loads(base64.standard_b64decode(spickled)) print(unpickled, unpickled.x, unpickled.y)

Ответ 2



Если писать энкодер не вариант, значит, можно использовать менее элегантный способ: import ast import json import pickle class Attribute: def __init__(self, x, y): self.x = x self.y = y def calc(): return self.x + self.y def __eq__(self, oth): return self.__dict__ == oth.__dict__ obj = Attribute(1, 1) # --- dump object_bytes = pickle.dumps(obj) object_bytes_str = str(object_bytes) object_json_dump = json.dumps(object_bytes_str) # --- dump # --- load object_bytes_str = json.loads(object_json_dump) object_bytes = ast.literal_eval(object_bytes_str) obj_from_dump = pickle.loads(object_bytes) # --- load print(obj == obj_from_dump) Тут основная решаемая задача - получение bytes из строки с помощью ast.literal_eval. Пока писал, появился ответ от Xander, который куда более предпочтительнее.

Комментариев нет:

Отправить комментарий