Tại sao yêu cầu tuần tự hóa trong python

Tuần tự hóa đối tượng là quá trình chuyển đổi trạng thái của một đối tượng thành luồng byte. Luồng byte này có thể được lưu trữ thêm trong bất kỳ đối tượng giống như tệp nào, chẳng hạn như tệp đĩa hoặc luồng bộ nhớ. Nó cũng có thể được truyền qua ổ cắm, v.v. Deserialization là quá trình tái cấu trúc đối tượng từ luồng byte

Python đề cập đến quá trình tuần tự hóa và giải tuần tự hóa theo thuật ngữ tẩy và giải nén tương ứng. Mô-đun 'dưa chua' đi kèm với thư viện chuẩn của Python xác định các chức năng để tuần tự hóa (dump() và dumps()) và giải tuần tự hóa (load() và loading())

Định dạng dữ liệu của mô-đun dưa chua rất đặc trưng cho Python. Do đó, các chương trình không được viết bằng Python có thể không giải tuần tự hóa dữ liệu được mã hóa (được chọn) đúng cách. Trên thực tế, việc giải nén dữ liệu từ nguồn không được xác thực không được coi là an toàn

giao thức dưa chua

Giao thức là các quy ước được sử dụng trong việc xây dựng và giải cấu trúc các đối tượng Python đến/từ dữ liệu nhị phân. Mô-đun pickle hiện tại xác định 5 giao thức khác nhau như được liệt kê bên dưới

Phiên bản giao thức 0Giao thức gốc “con người có thể đọc được” tương thích ngược với các phiên bản trước đó. Phiên bản giao thức 1Định dạng nhị phân cũ cũng tương thích với các phiên bản Python cũ hơn. Phiên bản giao thức 2Được giới thiệu trong Python 2. 3 cung cấp hiệu quả tẩy các lớp kiểu mới. Phiên bản giao thức 3Đã thêm vào Python 3. 0. được khuyến nghị khi cần có khả năng tương thích với các phiên bản Python 3 khác. Giao thức phiên bản 4 đã được thêm vào Python 3. 4. Nó thêm hỗ trợ cho các đối tượng rất lớn

Để biết phiên bản giao thức cao nhất và mặc định của bản cài đặt Python của bạn, hãy sử dụng các hằng số sau được xác định trong mô-đun pickle

>>> import pickle
>>> pickle.HIGHEST_PROTOCOL
4
>>> pickle.DEFAULT_PROTOCOL
3

Các hàm dump() và load() của mô-đun pickle tương ứng thực hiện việc tẩy và giải nén dữ liệu Python. Hàm dump() ghi đối tượng được chọn vào một tệp (hoặc tệp giống như đối tượng) và hàm load() giải nén dữ liệu từ tệp trở lại đối tượng Python

Chương trình sau chọn một đối tượng từ điển thành một tệp nhị phân

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()

Khi đoạn mã trên được thực thi, biểu diễn byte của đối tượng từ điển sẽ được lưu trữ trong 'pickled. tập tin txt'. Tệp phải được bật chế độ 'ghi và nhị phân'

Mặt khác, hàm load() giải nén hoặc giải tuần tự hóa dữ liệu từ tệp nhị phân trở lại từ điển Python. Chạy tập lệnh sau

dưa chua nhập khẩu

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()

Bảng điều khiển Python hiển thị đối tượng từ điển được đọc từ tệp

{'age': 23, 'Gender': 'Male', 'name': 'Rajeev', 'marks': 75}

Lưu ý rằng đối tượng từ điển không giữ lại thứ tự chèn khóa. Do đó các cặp k-v trong từ điển truy xuất có thể không theo thứ tự ban đầu

Mô-đun pickle cũng bao gồm hàm dumps() để xử lý dữ liệu Python thành một biểu diễn chuỗi

>>> from pickle import dump
>>> dct={"name":"Rajneesh", "age":23, "Gender":"Male","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.'

Sử dụng hàm loading() để giải nén chuỗi và lấy đối tượng từ điển gốc

>>> from pickle import load
>>> dct=loads(dctstring)
>>> dct
{'name': 'Rajneesh', 'age': 23, 'Gender': 'Male', 'marks': 75}

Ngoài các chức năng tiện lợi trên, module pickle còn định nghĩa các lớp Pickler và Unpickler. Lớp Pickler có phương thức dump() ghi dữ liệu dưa chua vào tệp nhị phân. Lớp Unpickler đọc dữ liệu nhị phân từ tệp và xây dựng đối tượng Python

Để ghi dữ liệu được chọn của đối tượng Python

từ dưa chua nhập khẩu

f=open("pickled.txt","wb")
dct={'name': 'Rajneesh', 'age': 23, 'Gender': 'Male', 'marks': 75}
Pickler(f).dump(dct)
f.close()

Để đọc lại dữ liệu bằng cách giải nén tệp nhị phân khỏi dưa chua, hãy nhập Unpickler

f=open("pickled.txt","rb")
dct=Unpickler(f).load()
print (dct)
f.close()

Giống như các đối tượng của kiểu dữ liệu tiêu chuẩn Python có thể được chọn, tương tự, các đối tượng của lớp tùy chỉnh cũng có thể được chọn và bỏ chọn

từ dưa chua nhập khẩu *

học sinh lớp

________số 8

Thư viện Python cũng chứa mô-đun 'nguyên soái' được sử dụng b Bản thân trình thông dịch Python để tuần tự hóa nội bộ các đối tượng Python

Tuần tự hóa đối tượng Python nội bộ (nguyên soái)

Mô-đun soái ca trong thư viện chuẩn của Python cung cấp các tính năng tuần tự hóa đối tượng (tương tự như mô-đun dưa chua). Tuy nhiên, nó không thực sự hữu ích cho việc duy trì dữ liệu cho mục đích chung trong tệp hoặc truyền đối tượng Python thông qua ổ cắm, v.v. Mô-đun này được chính trình thông dịch Python sử dụng nội bộ để thực hiện thao tác đọc/ghi trên các phiên bản đã biên dịch của mô-đun Python (. tệp pyc). Định dạng dữ liệu được sử dụng bởi mô-đun soái ca liên tục thay đổi và không tương thích trên các phiên bản Python (thậm chí không phải phiên bản phụ). Đó là lý do tại sao tập lệnh Python được biên dịch (. pyc) của một phiên bản có thể sẽ không thực thi trên một phiên bản khác. Do đó, mô-đun soái ca được sử dụng để tuần tự hóa đối tượng bên trong của Python

Tương tự như mô-đun dưa chua, mô-đun marshal cũng định nghĩa các hàm load() và dump() để đọc và ghi các đối tượng được sắp xếp từ/tới tệp. Ngoài ra, hàm loading() và dumps() xử lý biểu diễn chuỗi của đối tượng được sắp xếp theo thứ tự

  • bãi (). trả về một byte giống như đối tượng của tôi sắp xếp một đối tượng Python. Chỉ các đối tượng thuộc loại dữ liệu tiêu chuẩn mới được hỗ trợ để sắp xếp theo thứ tự. Các loại không được hỗ trợ làm tăng ngoại lệ ValueError
  • tải (). Hàm này chuyển đổi đối tượng giống như byte thành đối tượng Python tương ứng. Nếu chuyển đổi không dẫn đến đối tượng Python hợp lệ, ValueError hoặc TypeError có thể tăng lên

Đoạn mã sau hiển thị một đối tượng từ điển Python được sắp xếp lại bằng cách sử dụng kết xuất (). Biểu diễn byte được chuyển đổi trở lại từ điển bằng hàm loading()

import marshal
person={"name":"Krishna", "age":22, "marks":[45,56,78]}
data=marshal.dumps(person)
obj= marshal.loads(data)
print (obj)
  • bãi rác(). Hàm này ghi biểu diễn byte của đối tượng Python được hỗ trợ vào một tệp. Bản thân tệp phải là tệp nhị phân có quyền ghi
  • trọng tải(). Hàm này đọc dữ liệu byte từ tệp nhị phân và chuyển đổi nó thành đối tượng Python

Như đã đề cập ở trên, mô-đun soái ca được trình thông dịch sử dụng để xử lý. tập tin pyc. Ví dụ sau minh họa việc sử dụng các hàm dump() và load() để xử lý các đối tượng mã Python, được sử dụng để lưu trữ các mô-đun Python được biên dịch sẵn

Đoạn mã này sử dụng hàm compile() tích hợp để xây dựng một đối tượng mã từ chuỗi nguồn nhúng các lệnh Python

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
0

Tham số tệp phải là tệp mà mã được đọc từ đó. Nếu nó không được đọc từ một tệp, hãy chuyển bất kỳ chuỗi tùy ý nào

Tham số chế độ được đặt thành 'exec' nếu nguồn chứa chuỗi các câu lệnh hoặc 'eval' nếu có một biểu thức hoặc 'đơn' nếu nó chứa một câu lệnh tương tác

Đối tượng mã biên dịch sau đó được lưu trữ trong một. pyc sử dụng hàm dump()

nguyên soái nhập khẩu

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
1

Để deserialize đối tượng từ. tệp pyc sử dụng hàm load(). Vì nó trả về một đối tượng mã nên nó có thể được chạy bằng hàm exec(), một hàm tích hợp khác

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
2

Đầu ra sẽ là kết quả của khối mã được nhúng trong chuỗi nguồn

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
3

Sự kiên trì của đối tượng Python (giá đỡ)

Một mô-đun khác có tên là 'shelve' trong thư viện chuẩn của Python là một công cụ đơn giản nhưng hiệu quả để lưu trữ dữ liệu liên tục khi bạn không thực sự cần một giải pháp cơ sở dữ liệu quan hệ. Đối tượng 'Kệ' được xác định trong mô-đun này là đối tượng giống như từ điển được lưu trữ liên tục trong tệp đĩa. Điều này tạo ra một tệp tương tự như cơ sở dữ liệu dbm trên các hệ thống giống như UNIX. Tuy nhiên, đối tượng chỉ có loại chuỗi mới được phép làm khóa trong đối tượng từ điển đặc biệt này, tuy nhiên, giá trị có thể là bất kỳ đối tượng có thể chọn nào

Mô-đun kệ định nghĩa ba lớp như sau

ShelfĐây là lớp cơ sở để triển khai kệ. Nó được khởi tạo với đối tượng giống như dict. BsdDbShelf Đây là một lớp con của lớp Shelf. Đối tượng dict được truyền cho hàm tạo của nó phải hỗ trợ các phương thức first(), next(), previous(), last() và set_location(). DbfilenameShelfĐây cũng là một lớp con của Shelf nhưng chấp nhận tên tệp làm tham số cho hàm tạo của nó chứ không phải đối tượng dict

Cách dễ nhất để tạo một đối tượng Shelf là sử dụng hàm open() được xác định trong mô-đun shelve trả về một đối tượng DbfilenameShelf

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
4

Tham số tên tệp được sử dụng làm tên của cơ sở dữ liệu được tạo

Giá trị mặc định cho tham số cờ là 'c' để truy cập đọc/ghi. Các cờ khác là 'w' (chỉ ghi) 'r' (chỉ đọc) và 'n' (mới có đọc/ghi)

Tham số giao thức biểu thị giao thức dưa chua được liệt kê trước đó

tham số ghi lại theo mặc định là sai. Nếu được đặt thành true, các mục đã truy cập sẽ được lưu vào bộ nhớ cache. Mọi thao tác truy cập gọi đồng bộ hóa () và đóng () do đó quá trình có thể chậm

Mã sau tạo cơ sở dữ liệu và lưu trữ các mục từ điển trong đó

kệ nhập khẩu

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
5

Điều này sẽ tạo ra bài kiểm tra. dir trong thư mục hiện tại và lưu trữ dữ liệu khóa-giá trị ở dạng băm. Đối tượng Shelf có sẵn các phương thức sau

close() Đồng bộ hóa và đóng đối tượng dict liên tục. sync() Ghi lại tất cả các mục trong bộ đệm nếu giá được mở với ghi lại được đặt thành True. get()Trả về giá trị được liên kết với khóa  items()danh sách bộ dữ liệu – mỗi bộ dữ liệu là cặp giá trị khóa  keys()danh sách khóa giá sách  pop()Xóa khóa đã chỉ định và trả về giá trị tương ứng. update() Cập nhật giá từ một giá trị dict/iterable khác() danh sách giá trị giá

Để truy cập giá trị của một khóa cụ thể trong giá

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
6

Các phương thức items(), keys() và values() trả về các đối tượng dạng xem

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
7

Để xóa một cặp khóa-giá trị khỏi giá

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
8

Lưu ý rằng cặp khóa-giá trị của điểm-75 đã bị xóa

Để hợp nhất các mục của một từ điển khác với giá sử dụng update() phương pháp

import pickle
f=open("pickled.txt","wb")
dct={"name":"Rajeev", "age":23, "Gender":"Male","marks":75}
pickle.dump(dct,f)
f.close()
9

Có một định dạng tuần tự hóa/giải tuần tự hóa phổ biến khác được gọi là JSON, viết tắt của Ký hiệu đối tượng JavaScript. Nó là một định dạng trao đổi dữ liệu nhẹ. Nó tương tự như dưa chua. Tuy nhiên, tuần tự hóa dưa chua là dành riêng cho Python trong khi định dạng JSON được nhiều ngôn ngữ triển khai. Mô-đun 'json' trong thư viện chuẩn của Python định nghĩa các hàm cho tuần tự hóa đối tượng

Giống như trong mô-đun pickle, mô-đun json cũng cung cấp hàm dumps() và loading() để tuần tự hóa đối tượng Python thành chuỗi được mã hóa JSON. Các hàm dump() và load() ghi và đọc các đối tượng Python được tuần tự hóa đến/từ tệp

bãi ()

Hàm này chuyển đổi đối tượng thành định dạng JSON

tải ()

Hàm này chuyển đổi một chuỗi JSON trở lại đối tượng Python

Ví dụ sau minh họa cách sử dụng cơ bản của các chức năng này

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
0

Hàm dumps() có thể lấy đối số sort_keys tùy chọn. Theo mặc định là Sai. Nếu được đặt thành True, các khóa từ điển sẽ xuất hiện theo thứ tự được sắp xếp trong chuỗi JSON

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
1

Hàm dumps() có một tham số tùy chọn khác được gọi là indent lấy một số làm giá trị. Nó quyết định độ dài của từng đoạn biểu diễn được định dạng của chuỗi json, tương tự như đầu ra pprint

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
2

Mô-đun json cũng có giao diện hướng đối tượng tương ứng với các chức năng tiện ích trên. Có hai lớp được định nghĩa trong mô-đun – JSONEncoder và JSONDecoder

Lớp mã hóa JSON

Đối tượng của lớp này là bộ mã hóa cho cấu trúc dữ liệu Python. Mỗi loại dữ liệu Python được chuyển đổi thành loại JSON tương ứng như trong bảng sau

PythonJSONdictobjectlist, tuplearraystrstringint, float, int- & float có nguồn gốc EnumsnumberTruetrueFalsefalseNonenull

Lớp JSONEncoder được khởi tạo bởi hàm tạo JSONEncoder(). Các phương thức quan trọng sau đây được định nghĩa trong lớp mã hóa

mã hóa(). tuần tự hóa đối tượng Python thành định dạng JSON

iterencode(). Mã hóa đối tượng và trả về một trình lặp mang lại dạng mã hóa của từng mục trong đối tượng

thụt vào. Xác định mức thụt lề của chuỗi được mã hóa

sort_keys. là đúng hoặc sai để làm cho các phím xuất hiện theo thứ tự được sắp xếp hay không

check_circular. nếu Đúng, hãy kiểm tra tham chiếu vòng trong đối tượng loại vùng chứa

Ví dụ sau mã hóa đối tượng danh sách Python

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
3

Sử dụng phương thức iterencode(), mỗi phần của chuỗi mã hóa được hiển thị như bên dưới

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
4

lớp JSONDEcoder

Đối tượng của lớp này giúp giải mã trong chuỗi json trở lại cấu trúc dữ liệu Python. Phương thức chính trong lớp này là giải mã(). Mã ví dụ sau truy xuất đối tượng danh sách Python từ chuỗi được mã hóa ở bước trước

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
5

JSON với các tệp

Mô-đun json xác định các hàm load() và dump() để ghi dữ liệu JSON vào một tệp giống như đối tượng – có thể là tệp đĩa hoặc luồng byte và đọc lại dữ liệu từ chúng

bãi rác().  

Hàm này mã hóa dữ liệu đối tượng Python ở định dạng JSON và ghi nó vào một tệp. Tệp phải có quyền ghi

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
6

Mã này sẽ tạo 'json. txt' trong thư mục hiện tại. Nó hiện nội dung như sau

f=open("pickled.txt","rb")
d=pickle.load(f)
print (d)
f.close()
7

trọng tải().  

Hàm này tải dữ liệu JSON từ tệp và xây dựng đối tượng Python từ tệp đó. Tệp phải được mở với quyền đọc

Tại sao phải tuần tự hóa?

Tuần tự hóa trong Java cho phép chúng tôi chuyển đổi Đối tượng thành luồng mà chúng tôi có thể gửi qua mạng hoặc lưu dưới dạng tệp hoặc lưu trữ trong DB để sử dụng sau này. Deserialization is the process of converting Object stream to actual Java Object to be used in our program.

Điều gì xảy ra nếu chúng ta không tuần tự hóa?

Điều gì xảy ra nếu bạn cố gắng gửi Đối tượng không được tuần tự hóa qua mạng? . Trong trường hợp này NotSerializableException sẽ được ném ra và sẽ xác định lớp của đối tượng không thể tuần tự hóa .

Công dụng của quy trình lập số sê-ri là gì?

Tuần tự hóa là một cơ chế chuyển đổi trạng thái của một đối tượng thành luồng byte. Deserialization là quá trình ngược lại trong đó luồng byte được sử dụng để tạo lại đối tượng Java thực tế trong bộ nhớ. Cơ chế này được sử dụng để duy trì đối tượng