Tuần tự hóa là gì?


8

Tôi đã xung quanh lập trình trong một thời gian như một sở thích, nhưng tôi đã không bắt đầu thấy khái niệm này cho đến gần đây. Tôi đã google "tuần tự hóa" là gì nhiều lần, nhưng tôi thực sự không bao giờ có được bất kỳ định nghĩa nào, thường chỉ là ví dụ về cách thực hiện. Tôi đang nhìn thấy nó trên các diễn đàn Ogre, diễn đàn Bullet và mọi diễn đàn khác tôi đến, vì vậy tôi nghĩ rằng đã đến lúc tôi thực sự hiểu nó là gì và tại sao phải sử dụng nó.

Biên tập

Để làm rõ, tôi đang tìm kiếm thêm lý do tại sao để sử dụng nó, đặc biệt là trong ý nghĩa của lập trình trò chơi. Ví dụ, API Bullet Vật lý nói rất nhiều về việc tuần tự hóa một lưới, vì vậy tôi muốn hiểu tại sao lại như vậy.

Cảm ơn bạn :)

Câu trả lời:


7

Từ tài liệu boost.serialization : Ở đây, chúng tôi sử dụng thuật ngữ "tuần tự hóa" để có nghĩa là giải cấu trúc đảo ngược của một tập hợp các cấu trúc dữ liệu C ++ tùy ý thành một chuỗi byte. Một hệ thống như vậy có thể được sử dụng để khôi phục cấu trúc tương đương trong bối cảnh chương trình khác. Tùy thuộc vào ngữ cảnh, điều này có thể được sử dụng kiên trì thực hiện đối tượng, truyền tham số từ xa hoặc cơ sở khác. Trong hệ thống này, chúng tôi sử dụng thuật ngữ "kho lưu trữ" để chỉ một kết xuất cụ thể của luồng byte này. Đây có thể là một tệp dữ liệu nhị phân, dữ liệu văn bản, XML hoặc một số khác được tạo bởi người dùng của thư viện này.

Nói cách khác, serialization là bất kỳ quá trình biến đổi đó đối tượng trong bộ nhớ vào một số loại bytestream, và deserialization làm điều ngược lại, tham gia một bytestream và biến nó trở thành các đối tượng trong bộ nhớ.

Thuật ngữ "tuần tự hóa" không ngụ ý bất cứ điều gì về định dạng của bytestream. Nó có thể là một định dạng nhị phân được đóng gói hiệu quả hoặc mô tả XML hoặc YAML lỏng lẻo. Nó thậm chí có thể là mã nguồn trong chính ngôn ngữ gốc hoặc trong ngôn ngữ lập trình khác, chẳng hạn như JSON , là một tập hợp con của JavaScript. Định dạng chính xác của luồng được tuần tự hóa nên được chọn dựa trên cách bạn định sử dụng nó.

Tuần tự hóa là một tính năng tích hợp của nhiều ngôn ngữ và môi trường - ví dụ JavaPython . Trong các ngôn ngữ cấp thấp hơn như C và C ++, người ta phải sử dụng (hoặc viết) các thư viện tuần tự hóa , vì cơ chế được cung cấp bởi ngôn ngữ thường không đủ tốt - nó không thể theo dõi hoặc tuần tự hóa các con trỏ và tham chiếu, và phải chịu các vấn đề về thời gian thí dụ.

Wikipedia có một bài viết khá về serialization.

Tuần tự hóa được sử dụng rộng rãi trong các trò chơi (và tất cả phần mềm) cho nhiều mục đích:

  • Tải danh sách tất cả các phép thuật trong trò chơi từ các tệp tài nguyên.
  • Lưu và tải trò chơi.
  • Ghi lại trạng thái của sự vật (ví dụ: vị trí và hàng tồn kho của người chơi) vào cơ sở dữ liệu SQL hoặc đối tượng.
  • Gọi các cuộc gọi chức năng từ xa qua mạng hoặc liên kết IPC khác.

6

Theo tôi hiểu, tuần tự hóa chỉ là khái niệm lấy một đối tượng hoặc một tập hợp các đối tượng, biến chúng thành một luồng byte (để lưu trữ dữ liệu hoặc truyền mạng, v.v.) và sau đó xây dựng lại đối tượng ban đầu từ bytestream đó (" khử lưu huỳnh ").

Hay thay đổi: Nó hơi giống một máy dịch chuyển tức thời Star Trek, bây giờ tôi nghĩ về nó.

Một số thư viện tồn tại cho điều này, mỗi thư viện đều xử lý những khúc mắc nhỏ có xu hướng cản trở (như endtestream endianness và như vậy).


Điều này có ý nghĩa, và tôi thực sự thích sự tương tự dịch chuyển tức thời, điều đó chắc chắn giúp hiểu được nó lol. Sử dụng tuần tự hóa để kết nối mạng có ý nghĩa hoàn hảo với tôi, nhưng sử dụng nó ở nơi khác, chẳng hạn như công cụ Bullet Vật lý và định dạng .bONS, tôi không hiểu nó được sử dụng ở đâu.
Aidan Knight

Để làm rõ hơn sự nhầm lẫn của mình, tôi đã tìm thấy hướng dẫn đơn giản này codeproject.com/KB/cpp/serialization_primer1.aspx và trên Bước 3, nó hiển thị tuần tự hóa dữ liệu thành một tệp. Tôi không hiểu điều đó khác biệt như thế nào so với việc chỉ viết văn bản vào một tệp bằng cách sử dụng fopen / fwrite, v.v.
Aidan Knight

Tuần tự hóa là quá trình biến các đối tượng trong phần mềm của bạn thành văn bản mà bạn có thể chuyển sang fwrite (hoặc bất kỳ trình đọc / ghi định hướng bytestream nào khác mà bạn cần).

3

Để nối tiếp một cái gì đó về cơ bản có nghĩa là thay đổi nó thành một chuỗi. Điều này là cần thiết nếu bạn muốn gửi một cái gì đó qua mạng hoặc ghi nó vào một tệp, bởi vì cả hai đều mong đợi một chuỗi byte. Vì vậy, nó thường là một thuật ngữ ưa thích cho các hệ thống lưu và tải. Trong trường hợp của Bullet, nó chỉ đơn giản là lấy dữ liệu lưới và lưu nó ra dưới dạng mà Bullet có thể sử dụng một cách hiệu quả. Bạn có thể lưu nó ra và tải nó sau mà không cần phải phân tích lại các mắt lưới của bạn.


0

Nối tiếp / Khử nối tiếp chỉ đơn giản là chuẩn bị trước và ghi / đọc các đối tượng vào / từ đĩa.


-3

Cá nhân tôi sử dụng serialization cho mạng. Ngoài ra tôi không thực sự có nhiều sử dụng cho nó. Nếu bạn muốn biết lý do tại sao nó được sử dụng trong Bullet, cơ hội tốt nhất bạn có được câu trả lời là bằng cách hỏi trong diễn đàn Bullet hoặc đọc tài liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.