Computer >> Máy Tính >  >> Kết nối mạng >> Kết nối mạng

Serialization là gì?

Trong cuộc họp cập nhật dự án gần đây, nhóm của tôi đã nói về cách chúng tôi sẽ sử dụng tuần tự hóa để gửi dữ liệu qua lại từ ứng dụng này.

Một kỹ sư đang tìm cách tham gia nhiều hơn vào các dự án phần mềm nói với tôi rằng họ không quen với thuật ngữ này.

Thật dễ dàng để bỏ lỡ các quy trình thiết yếu như thế này mà không xuất hiện cho đến khi bạn đi sâu vào các dự án rộng lớn hơn. Đây là trường hợp của người này, cũng như đối với tôi tại một thời điểm.

Vì vậy, tôi muốn viết về nó. Tôi đã giúp đồng nghiệp của mình tìm hiểu về tuần tự hóa vào ngày hôm đó và bạn sẽ tìm hiểu về nó hôm nay.

Serialization là gì?

Tuần tự hóa là quá trình trong đó một dịch vụ lấy cấu trúc dữ liệu, chẳng hạn như từ điển bằng Python, kết thúc nó và truyền nó đến một dịch vụ khác để đọc. Đó là định nghĩa đơn giản.

Hãy tưởng tượng rằng tôi cần gửi một tin nhắn cho ai đó. Vì vậy, tôi viết ra văn bản trên một câu đố đã được lắp ráp sẵn. Tôi tách các mảnh ra, thêm một số hướng dẫn về cách lắp ráp lại khối hình và gửi nó đi cùng.

Người nhận tin nhắn sau đó lấy các mảnh ghép, ghép chúng lại với nhau và bây giờ họ có tin nhắn của tôi.

Serialization là gì?
Quy trình tuần tự hóa cơ bản của các sự kiện

Định nghĩa kỹ thuật vui hơn một chút. Nói một cách ngắn gọn, tuần tự hóa là quá trình chuyển đổi một đối tượng dữ liệu thành một luồng byte và lưu trạng thái của đối tượng để lưu trữ trên đĩa hoặc truyền qua mạng. Điều này làm giảm kích thước lưu trữ cần thiết và giúp truyền thông tin qua mạng dễ dàng hơn.

Serialization là gì?
Quy trình tuần tự hóa

So sánh và Serialization - sự khác biệt là gì?

Có thể nghĩ đến quá trình soái ca. Marshaling là quá trình chuyển đổi biểu diễn bộ nhớ của một đối tượng thành một dạng phù hợp để truyền.

Mặc dù việc sắp xếp và tuần tự hóa đều lỏng lẻo đồng nghĩa, có một sự khác biệt quan trọng. Ví dụ:khi tạo chương trình Golang để đọc dữ liệu JSON thành cấu trúc dữ liệu Golang, bạn có thể sử dụng tính năng sắp xếp để dịch các giá trị khóa JSON thành giá trị khóa Golang.

Sự khác biệt là tính năng sắp xếp có thể được sử dụng để dịch dữ liệu. Ngược lại, tuần tự hóa sẽ gửi hoặc lưu trữ dữ liệu trong một luồng byte và tập hợp lại ở dạng ban đầu. Cả hai đều thực hiện tuần tự hóa, nhưng có sự khác biệt về mục đích trong hai quy trình này.

Bạn có thể xem cấu trúc này mà tôi đã tạo để tương tác với dữ liệu Twitter bên dưới như một ví dụ về sắp xếp trong hành động. Trong Golang, bạn có thể đưa ra các gợi ý được gọi là thẻ, dễ dàng chuyển đổi đối tượng này thành dữ liệu JSON bằng cách sử dụng dịch vụ sắp xếp có sẵn của Golang.

Serialization là gì?
Cấu trúc Golang sử dụng thẻ JSON

Endianness là gì?

Tôi cũng muốn chạm nhẹ vào chủ đề của sự kết thúc. Endianness là một thuật ngữ dùng để mô tả thứ tự của các byte trong bộ nhớ.

Bạn có thể coi bộ nhớ như một khối lưu trữ dữ liệu. Để tuần tự hóa hoạt động, luồng byte cần phải chuyển các kiểu dữ liệu bất kể mức độ cuối cùng thay đổi từ hệ thống này sang hệ thống khác.

Bạn có thể thấy sự khác biệt nhỏ và lớn bên dưới. Điều quan trọng là giá trị cuối phải khớp từ hệ thống này sang hệ thống khác hoặc được chuyển đổi bằng cách nào đó, vì không phải tất cả các hệ thống đều sắp xếp các bit của chúng theo cùng một cách.

Serialization là gì?
Phép lịch sự nhỏ và lớn của https://pvs-studio.com/en/blog / Lesson / 0019 /

Các Trường hợp Sử dụng cho Serialization

Trường hợp sử dụng của chúng tôi tận dụng tối đa các tính năng này. Chúng tôi dự định lấy một số thông tin từ phần cứng mà chúng tôi đang quét, gói thông tin đó thành một luồng byte và gửi nó cùng với mạng tới một dịch vụ khác sẽ cấu trúc lại dữ liệu.

Quá trình đảo ngược quá trình tuần tự hóa và xây dựng lại dữ liệu trở lại dạng ban đầu được gọi là quá trình giải mã hóa .

Có những trường hợp sử dụng khác cho việc này. Ví dụ, các API REST hoặc các giao thức nhắn tin như AMQP có thể sử dụng tuần tự hóa để nén và gửi dữ liệu.

AMQP là một giao thức nhắn tin trong đó bạn gửi tin nhắn đến một nhà môi giới AMQP và dịch vụ nhận sẽ “lắng nghe” nhà môi giới này cho một tin nhắn. Các kỹ sư phụ trợ có thể biết rõ điều này, vì điều này thường được sử dụng để gửi dữ liệu qua lại trong các hệ thống phân tán.

Nhiều ngôn ngữ lập trình bao gồm khả năng quay một số tuần tự hóa một cách dễ dàng. Vì vậy, nó là một chủ đề bất khả tri về ngôn ngữ.

Ví dụ về tuần tự hóa

Hãy đưa ra một ví dụ nhanh. Mã này sử dụng kombu thư viện để gửi tin nhắn qua AMQP. Chúng tôi đang sử dụng quyền này để gửi tin nhắn từ gói phần mềm này sang gói phần mềm khác qua mạng. Mã này dành cho dịch vụ gửi tin nhắn đến nhà môi giới AMQP:

def send_message(self, payload, sender_serializer):
...
    try:
        producer.publish(
            {'payload': message},
            ...
            serializer = 'json',
            ...
        )
        return

Lưu ý về publish phương pháp. Chúng tôi đang truyền phương thức tuần tự hóa như một đối số để thư viện biết cách tuần tự hóa dữ liệu mà chúng tôi đang truyền vào.

Thông điệp dữ liệu được chuyển đổi thành một dòng byte, nếu bạn nhìn vào nó, trông giống như một chuỗi dài gồm các chữ cái và số, và chúng tôi gửi thông điệp.

Dịch vụ tương ứng sẽ sử dụng cùng một phương pháp tuần tự hóa để tái tạo lại dữ liệu ở trạng thái ban đầu. Đây là một tính năng quan trọng vì chúng tôi đang tạo ra một bộ công cụ cần có khả năng gửi tin nhắn cho nhau để chúng hoạt động.

Serialization Data Formats

Tôi sử dụng JSON để tuần tự hóa bất cứ khi nào nhiệm vụ trong tầm tay yêu cầu nó. Tuy nhiên, bạn cũng có thể sử dụng một số người khác.

JSON có rất nhiều chi phí, nhưng khả năng đọc của con người khiến nó trở nên lý tưởng đối với tôi. Bạn cũng có thể sử dụng Protobufs, YAML hoặc XML. Đó chỉ là một số định dạng đối tượng dữ liệu mà bạn có thể sử dụng.

Kết luận

Tôi rất vui vì tôi đã đưa nó ra khỏi hệ thống của mình. Tôi phải ngừng suy nghĩ về điều này, và hy vọng rằng ai đó đã học được điều gì đó từ nó.

Việc tuần tự hóa trở nên cần thiết khi bạn đang tập hợp đường truyền thông tin liên lạc của mình. Bạn nên biết về chủ đề này để cảm thấy tự tin khi tiếp cận bất kỳ công cụ nào bạn đang sử dụng với kiến ​​thức nền tảng phù hợp.

-George