Show me the code
常见的python 序列化
1 | import cPickle |
1 | In [4]: print(s) |
序列化之后能大概猜到保存了s的类名以及属性
poc
1 | import cPickle |
1 | In [4]: print(s) |
如果class有__reduce__函数,可以大概看出,cPickle 序列化没有保存s类名及属性,而是保存了__reduce__方法的return结果
参考引用【2】
当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们。 __reduce__ 被定义之后,当对象被Pickle时就会被调用。它要么返回一个代表全局名称的字符串,Pyhton会查找它并pickle,要么返回一个元组。这个元组包含2到5个元素,其中包括:一个可调用的对象,用于重建对象时调用;一个参数元素,供那个可调用对象使用;被传递给 __setstate__ 的状态(可选);一个产生被pickle的列表元素的迭代器(可选);一个产生被pickle的字典元素的迭代器(可选)
python的反序列化问题出现在__reduce__方法上
PVM
如果需要深入理解python pickle逻辑,需要了解python虚拟机(PVM),可参考【1】
现在暂不跟进