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 Show 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 chuaGiao 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ố 8Thư 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ự
Đ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)
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 dictCá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 EnumsnumberTruetrueFalsefalseNonenullLớ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ệpMô-đ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 |