คำว่า serialization ของอ็อบเจ็กต์หมายถึงกระบวนการแปลงสถานะของอ็อบเจ็กต์เป็นไบต์สตรีม เมื่อสร้างแล้ว ไบต์สตรีมนี้สามารถจัดเก็บเพิ่มเติมในไฟล์หรือส่งผ่านซ็อกเก็ต ฯลฯ ในทางกลับกัน การสร้างวัตถุจากสตรีมไบต์ขึ้นใหม่เรียกว่าดีซีเรียลไลเซชัน
ศัพท์เฉพาะของ Python สำหรับการทำให้เป็นอนุกรมและดีซีเรียลไลซ์เซชั่นคือการดองและการคลายออกตามลำดับ โมดูล pickle ที่มีอยู่ในไลบรารีมาตรฐานของ Python มีฟังก์ชันสำหรับ serialization (dump() และ dumps()) และ deserialization (load() และ loads())
โมดูล Pickle ใช้รูปแบบข้อมูลเฉพาะของ Python ดังนั้น โปรแกรมที่ไม่ได้เขียนด้วย Python อาจไม่สามารถทำการดีซีเรียลไลซ์ข้อมูลที่เข้ารหัส (ที่ถูกเลือก) ได้อย่างถูกต้อง นอกจากนี้ยังไม่ถือว่าปลอดภัยในการถอดรหัสข้อมูลจากแหล่งที่ไม่ผ่านการตรวจสอบสิทธิ์
โปรโตคอลดอง
โปรโตคอลเป็นแบบแผนที่ใช้ในการสร้างและแยกโครงสร้างอ็อบเจ็กต์ Python ไปยัง/จากข้อมูลไบนารี โมดูล pickle ปัจจุบันกำหนด 5 โปรโตคอลที่แตกต่างกันตามรายการด้านล่าง -
| โปรโตคอลเวอร์ชัน 0 | โปรโตคอลเดิมที่ "มนุษย์อ่านได้" ย้อนหลังได้กับเวอร์ชันก่อนหน้า |
| โปรโตคอลเวอร์ชัน 1 | รูปแบบไบนารีแบบเก่ายังเข้ากันได้กับ Python เวอร์ชันก่อนหน้าด้วย |
| โปรโตคอลเวอร์ชัน 2 | เปิดตัวใน Python 2.3 ให้การเลือกคลาสรูปแบบใหม่ที่มีประสิทธิภาพ |
| โปรโตคอลเวอร์ชัน 3 | เพิ่มใน Python 3.0 แนะนำเมื่อต้องการความเข้ากันได้กับ Python 3 เวอร์ชันอื่น |
| โปรโตคอลเวอร์ชัน 4 | ถูกเพิ่มใน Python 3.4.0 เพิ่มการรองรับวัตถุขนาดใหญ่มาก |
หากต้องการทราบเวอร์ชันโปรโตคอลสูงสุดและดีฟอลต์ของการติดตั้ง Python ของคุณ ให้ใช้ค่าคงที่ที่กำหนดไว้ในโมดูล pickle
>>> import pickle >>> pickle.HIGHEST_PROTOCOL 4 >>> pickle.DEFAULT_PROTOCOL 3
ดังที่กล่าวไว้ก่อนหน้านี้ ฟังก์ชัน dump() และ load() ของโมดูล pickle ทำการดองและดึงข้อมูล Python ฟังก์ชัน dump() เขียนวัตถุที่ดองลงในไฟล์ และฟังก์ชัน load() จะแยกข้อมูลจากไฟล์ไปยังวัตถุ Python
โปรแกรมต่อไปนี้จะดองวัตถุพจนานุกรมลงในไฟล์ไบนารี
import pickle
f = open("data.txt","wb")
dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close() เมื่อเรียกใช้โค้ดด้านบน การแสดงไบต์ของอ็อบเจ็กต์พจนานุกรมจะถูกเก็บไว้ในไฟล์ data.txt
ในการแกะหรือดีซีเรียลไลซ์ข้อมูลจากไฟล์ไบนารีกลับไปที่พจนานุกรม ให้รันโปรแกรมต่อไปนี้
import pickle
f = open("data.txt","rb")
d = pickle.load(f)
print (d)
f.close() คอนโซล Python แสดงวัตถุพจนานุกรมที่อ่านจากไฟล์
{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75} โมดูล pickle ยังประกอบด้วยฟังก์ชัน dumps() ที่ส่งคืนการแสดงสตริงของข้อมูลที่ดอง
>>> from pickle import dump
>>> dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.' ใช้ฟังก์ชัน loads() เพื่อคลายสตริงและรับออบเจกต์พจนานุกรมดั้งเดิม
>>> from pickle import load
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75} โมดูล pickle ยังกำหนดคลาส Pickler และ Unpickler คลาส Pickler เขียนข้อมูลของ Pickler ลงในไฟล์ คลาส Unpickler อ่านข้อมูลไบนารีจากไฟล์และสร้างวัตถุ Python
การเขียนข้อมูลดองของวัตถุ Python
from pickle import pickler
f = open("data.txt","wb")
dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Pickler(f).dump(dct)
f.close() วิธีอ่านข้อมูลย้อนหลังโดยคลายไฟล์ไบนารี
from pickle import Unpickler
f = open("data.txt","rb")
dct = Unpickler(f).load()
print (dct)
f.close() ออบเจ็กต์ของประเภทข้อมูลมาตรฐาน Python ทั้งหมดนั้นสามารถเลือกได้ นอกจากนี้ วัตถุของคลาสที่กำหนดเองยังสามารถดองและไม่ดองได้
from pickle import *
class person:
def __init__(self):
self.name = "XYZ"
self.age = 22
def show(self):
print ("name:", self.name, "age:", self.age)
p1 = person()
f = open("data.txt","wb")
dump(p1,f)
f.close()
print ("unpickled")
f = open("data.txt","rb")
p1 = load(f)
p1.show() ไลบรารี Python ยังมีโมดูล marshal ที่ใช้สำหรับการทำให้เป็นอนุกรมภายในของอ็อบเจกต์ Python