1

jsonpickle を使用して collection.deque リストを保存および復元しようとしましたが、その過程で maxlen パラメータが失われました。

original_test = deque(maxlen=2)
original_test.append(1)
original_test.append(2)

print(original_test)
>>> deque([1, 2], maxlen=2) # everything ok

encoded_test = jsonpickle.encode(original_test)
print(encoded_test)
>>> {"py/seq": [1, 2], "py/object": "collections.deque"} # where is maxlen?

restored_test = jsonpickle.decode(encoded_test)
restored_test.append(3)

print(restored_test)
>>> deque([1, 2, 3]) # maxlen missing
4

1 に答える 1

1

jsonpickle、それ自体では、どの属性をシリアライズする必要があるかを推測しません。カスタム クラスを作成している場合は、それを指定する必要があります

ただし、クラスを制御できないため、カスタムのシリアライゼーション ハンドラdequeを実装する必要があります。

class DequeHandler(jsonpickle.handlers.BaseHandler):
    def flatten(self, obj, data):
        return list(obj),obj.maxlen
    def restore(self,obj):
        return deque(obj[0], maxlen=obj[1])
jsonpickle.handlers.register(deque, DequeHandler)
于 2013-10-21T13:24:05.583 に答える