1

I try to save and restore a collection.deque list with jsonpickle but the maxlen parameter gets lost in the process.

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
fanti
  • 1,859
  • 3
  • 16
  • 31

1 Answers1

1

jsonpickle, by itself, does not guess which attributes should be serialized. If you're writing custom classes, you must tell it.

Since you have no control over the deque class, however, you must implement a custom serialization handler:

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)
loopbackbee
  • 21,962
  • 10
  • 62
  • 97