【第二十九天 - Python 反序列化】

Q1. 什麽是 python 反序列化

当我们希望在 Python 中保存一个物件(例如将机器学习训练好的 Model 储存为档案,使得未来程序执行时可以将物件状态直接读取进记忆体中,不用从头训练),此时程序可以将物件的属性与状态利用特定的规则编码,转为资料序列进行储存,这便称为序列化 (Serialize) 。

序列化是许多程序语言都具备的功能,例如先前介绍过的 PHP;而将被序列化的物件还原的过程就称为反序列化。

Pickle 是 Python 中提供序列化功能的常见 Module,(python2 中,除了 pickle 还有 cPickle)

  • 序列化: pickle.dumps()
  • 反序列化: pickle.loads()
  • 以下是 python 3.8 执行结果

https://ithelp.ithome.com.tw/upload/images/20211013/20140592kebkR7sZ0L.png

Q2. 反序列化利用

Python 中的 __reduce__,类似 PHP 物件中的 __wakeup() 方法,会在反序列化时自动呼叫

import pickle
import os

class Baba(object):
	def __reduce__(self):
    return os.system,("ipconfig",)

payload = pickle.dumps(Baba())
  • 由於 Pickle 的反序列化原理较 PHP 复杂许多,较不易凭空撰写,这边建立一个 Class Baba
  • Baba 里面有个 __reduce__ ,这是一个 magic method ,在反序列化时会自动被呼叫,并且自动执行回传的参数:
    • 参数有二,第一个参数要是 callable 的物件 (例如一个 function);而第二个参数要是一个 tuple。
    • 反序列化时,会将 tuple 内的元素当作参数,呼叫第一个参数的 function,此例中就相当於 call os.system("ipconfig")
  • pickle.dumps(Baba()) 会建立一个 Baba 物件,并进行序列化。
  • 此时若我们将序列化的 payload 传入 pickle.loads ,就会成功执行 os.system ,得到 ipconfig 的结果

https://ithelp.ithome.com.tw/upload/images/20211013/20140592VG1QffwQ6x.png


<<:  【在厨房想30天的演算法】Day 28 资讯安全与演算法 : 讯息监别码

>>:  Day 28 - 用 canvas 与 pdfjs 做文件签名(上)

Day-2: Ruby on Rails 是什麽?

Ruby on Rails 是使用Ruby这套开放原始码(采用MIT授权)、 物件导向程序语言所开发...

LeetCode解题 Day29

725. Split Linked List in Parts https://leetcode.c...

30-4 之软件架构设计原则 3 - LSP 里氏替换原则

软件架构设计原则一切都是为了下面这两点,别忘了。 低耦合 高内聚 LSP 这个原则比较倾向是在物件导...

图的拓扑排序 - DAY 29

说明 拓朴排序的图,不能为环 主要应用在专案是否可以照顺序进行 利用堆叠去找到流程 橘色数字为执行到...

LINE电脑版影片无法拨放,只看到第一个画格

LINE电脑版影片无法拨放,只看到第一个画格 影片都不会动 要下载下来存档 另外使用媒体播放 处理方...