【问题标题】:Jsonpickle - ensure deterministic encodingJsonpickle - 确保确定性编码
【发布时间】:2018-08-23 04:40:42
【问题描述】:

编码基本上是字典的字符串表示,包含对象的字段。但是,字典不尊重顺序,我可能会在不同的运行中得到不同的编码字符串。我如何防止这种情况发生?或者我应该使用另一个可以确保确定性编码的库?

通过确定性编码,我的意思是,如果我创建 100000 个几乎相同的对象,即相同的类和相同的构造函数参数,当我在每个对象上调用 encode() 时,我每次都会得到完全相同的字符串。

例如,如果我有

class MyClass(object):
   def __init__(self, a, b):
      self.a = a
      self.b = b

c1 = MyClass(1, 2)

c2 = MyClass(1, 2)

我想确保字符串 encode(c1) 和 encode(c2) 完全一样,字符对字符,即

assert jsonpickle.encode(c1)==jsonpickle.encode(c2)

【问题讨论】:

  • 看不懂,基本一样。仅向我们展示您的 2 个对象。
  • 请看我的附加编辑。

标签: python serialization deserialization pickle jsonpickle


【解决方案1】:

我认为 jsonpickle 会处理你所谓的确定性 endocing。

例子

import jsonpickle
class Monopoly(object):

    def __init__(self):
        self.boardwalk_price = 500

    @property
    def boardwalk(self):
        self.boardwalk_price += 50
        return self.boardwalk_price



m = Monopoly()
serialized = jsonpickle.encode(m)

看看

print (serialized)
{"py/object": "__main__.Monopoly", "boardwalk_price": 500}

现在,让我们解码

d = jsonpickle.decode(serialized)
print (d)
<__main__.Monopoly object at 0x7f01bc093278>
d.boardwalk_price
500

为了比较对象,Python 使用标识符。

class MyClass(object):
   def __init__(self, a, b):
      self.a = a
      self.b = b

c1 = MyClass(1, 2)
c2 = MyClass(1, 2)

如果你看一下id

id(c1)
140154854189040
id(c2)
140154854190440
c1 == c2

False

您可以覆盖 eq 运算符

def __eq__(self, x):
    if isinstance(x, number):
        return self.number == x.number
    return False

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2015-03-30
    相关资源
    最近更新 更多