คำว่า 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