CodeGym/Blog Java/Ngẫu nhiên/Các định dạng tuần tự hóa Java

Các định dạng tuần tự hóa Java

Xuất bản trong nhóm
CHÀO! Hãy nói về tuần tự hóa. Bạn có thể nhớ rằng chúng ta đã có bài học về tuần tự hóa. Và chúng tôi đã làm như vậy :) Đây là cái đầu tiên Và đây là cái thứ hai. Nếu bạn không nhớ rõ cách tuần tự hóa hoạt động, tại sao cần phải tuần tự hóa và Java có những công cụ nào để tuần tự hóa, bạn có thể xem qua các bài học này. Bài học hôm nay sẽ là về lý thuyết. Chúng ta sẽ xem xét kỹ hơn các định dạng tuần tự hóa. Đầu tiên, hãy nhớ lại tuần tự hóa là gì. Tuần tự hóa là quá trình lưu trữ trạng thái của một đối tượng trong một chuỗi byte. Deserialization là quá trình khôi phục một đối tượng từ các byte này. Một đối tượng Java có thể được đánh số thứ tự và gửi qua mạng (ví dụ: tới một máy tính khác). Chuỗi byte có thể được biểu diễn ở các định dạng khác nhau. Bạn đã quen với khái niệm này khi sử dụng máy tính thông thường. Ví dụ: một cuốn sách điện tử (hoặc một tài liệu văn bản đơn giản) có thể được viết bằng nhiều định dạng khác nhau:
  • docx (định dạng Microsoft Word);
  • pdf (định dạng Adobe);
  • mobi (thường được sử dụng trên thiết bị Amazon Kindle);
  • và nhiều hơn nữa (ePub, djvu, fb2, v.v.).
Trong mỗi trường hợp, mục tiêu dường như giống nhau: trình bày văn bản ở dạng con người có thể đọc được. Tuy nhiên, mọi người đã phát minh ra rất nhiều định dạng khác nhau. Không đi sâu vào chi tiết công việc của họ, chúng ta có thể cho rằng họ có lý do chính đáng. Mỗi định dạng đều có ưu nhược điểm riêng so với các định dạng còn lại. Có thể các định dạng tuần tự hóa khác nhau đã được tạo theo các nguyên tắc tương tự này? Dự đoán tuyệt vời, sinh viên! :) Điều đó hoàn toàn chính xác. Thực tế là việc gửi dữ liệu qua dây (hoặc không dây) là một công việc phức tạp và liên quan đến nhiều yếu tố. Ai đang gửi dữ liệu? Đến đâu? khối lượng gì? Người nhận sẽ là con người hay máy tính (nghĩa là dữ liệu có thể đọc được bằng con người)? Thiết bị nào sẽ đọc dữ liệu? Rõ ràng, những tình huống này là khác nhau. Gửi hình ảnh 500 KB từ điện thoại thông minh này sang điện thoại thông minh khác là một chuyện. Và đó là một điều hoàn toàn khác nếu chúng ta đang nói về 500 terabyte dữ liệu kinh doanh phải được nén tối ưu và gửi càng nhanh càng tốt. Hãy làm quen với các định dạng xê-ri hóa chính và xem xét ưu điểm và nhược điểm của từng định dạng đó!

JSON

Ký hiệu đối tượng JavaScript. Bạn đã biết một chút về định dạng này! Chúng ta đã nói về nó trong bài học này và chúng ta đã đề cập đến việc tuần tự hóa thành JSON ngay tại đây . Nó có tên của nó cho một lý do. Các đối tượng Java được chuyển đổi thành JSON thực sự giống hệt các đối tượng trong JavaScript. Bạn không cần biết JavaScript để hiểu đối tượng của chúng tôi:
{
   "title": "War and Peace",
   "author": "Lev Tolstoy",
   "year": 1869
}
Chúng tôi không giới hạn việc gửi một đối tượng. Định dạng JSON cũng có thể đại diện cho một mảng các đối tượng:
[
 {
   "title": "War and Peace",
   "author": "Lev Tolstoy",
   "year": 1869
 },

 {
   "title": "Demons",
   "author": "Fyodor Dostoyevsky",
   "year": 1872
 },

 {
   "title": "The Seagull",
   "author": "Anton Chekhov",
   "year": 1896
 }
]
Vì JSON đại diện cho các đối tượng JavaScript nên nó hỗ trợ các định dạng dữ liệu JavaScript sau:
  • dây;
  • con số;
  • các đối tượng;
  • mảng;
  • booleans (đúng và sai);
  • vô giá trị.
Lợi ích của JSON là gì?
  1. Định dạng con người có thể đọc được. Đây là một lợi thế rõ ràng nếu người dùng cuối của bạn là con người. Ví dụ: giả sử máy chủ của bạn có cơ sở dữ liệu với lịch trình các chuyến bay. Một khách hàng đang ngồi trước máy tính ở nhà, yêu cầu dữ liệu từ cơ sở dữ liệu này bằng ứng dụng web. Vì bạn cần cung cấp dữ liệu ở định dạng mà anh ấy có thể hiểu được nên JSON là một giải pháp tuyệt vời.

  2. Sự đơn giản. Nó cực kỳ đơn giản :) Ở trên, chúng tôi đã đưa ra một ví dụ về hai tệp JSON. Và ngay cả khi bạn chưa từng nghe về JavaScript (chưa nói đến các đối tượng JavaScript), bạn có thể dễ dàng hiểu được loại đối tượng được mô tả ở đó.
    Toàn bộ tài liệu JSON bao gồm một trang web với một vài hình ảnh.

  3. Sử dụng rộng rãi. JavaScript là ngôn ngữ giao diện người dùng chiếm ưu thế và nó có các yêu cầu riêng. Sử dụng JSON là điều bắt buộc. Do đó, một số lượng lớn các dịch vụ web sử dụng JSON làm định dạng trao đổi dữ liệu. Mọi IDE hiện đại đều hỗ trợ định dạng JSON (bao gồm cả IntelliJ IDEA). Một loạt các thư viện đã được viết cho tất cả các loại ngôn ngữ lập trình để cho phép làm việc với JSON.

Ví dụ, bạn đã làm việc với thư viện Jackson trong một bài học mà chúng ta đã học cách tuần tự hóa các đối tượng Java thành JSON. Nhưng ngoài Jackson, chẳng hạn, chúng tôi có GSON , đây là một thư viện rất tiện lợi của Google.

YAML

Ban đầu, YAML là viết tắt của "Yet Another Markup Language". Khi mới bắt đầu, nó được định vị là đối thủ cạnh tranh của XML. Giờ đây, theo thời gian, YAML có nghĩa là "YAML không phải là ngôn ngữ đánh dấu". Chính xác nó là cái gì? Hãy tưởng tượng rằng chúng ta cần tạo 3 lớp để đại diện cho các nhân vật trong một trò chơi trên máy tính: Chiến binh, Pháp sư và Kẻ trộm. Chúng sẽ có các đặc điểm sau: sức mạnh, sự nhanh nhẹn, sức bền, một bộ vũ khí. Đây là tệp YAML mô tả các lớp của chúng tôi sẽ trông như thế nào:
classes:
 class-1:
   title: Warrior
   power: 8
   agility: 4
   stamina: 7
   weapons:
     - sword
     - spear

 class-2:
   title: Mage
   power: 5
   agility: 7
   stamina: 5
   weapons:
     - magic staff

 class-3:
   title: Thief
   power: 6
   agility: 6
   stamina: 5
   weapons:
     - dagger
     - poison
Tệp YAML có cấu trúc cây: một số phần tử được lồng trong các phần tử khác. Chúng tôi có thể kiểm soát việc lồng nhau bằng cách sử dụng một số khoảng trắng nhất định mà chúng tôi sử dụng để biểu thị từng cấp độ. Ưu điểm của định dạng YAML là gì?
  1. Con người có thể đọc được. Một lần nữa, ngay cả khi nhìn thấy một tệp YAML không có mô tả, bạn có thể dễ dàng hiểu các đối tượng mà nó mô tả. YAML dễ đọc đến mức con người có thể đọc được trang web yaml.org là một tệp YAML thông thường :)

  2. Sự gọn nhẹ. Cấu trúc tệp được tạo bằng dấu cách: không cần sử dụng dấu ngoặc hoặc dấu ngoặc kép.

  3. Hỗ trợ cấu trúc dữ liệu gốc cho các ngôn ngữ lập trình. Lợi thế rất lớn của YAML so với JSON và nhiều định dạng khác là nó hỗ trợ nhiều cấu trúc dữ liệu khác nhau. Chúng bao gồm:

    • !!map
      Một tập hợp các cặp khóa-giá trị không được sắp xếp theo thứ tự;

    • !!omap
      Một chuỗi các cặp khóa-giá trị được sắp xếp theo thứ tự không được trùng lặp;

    • !!pairs:
      Một chuỗi các cặp khóa-giá trị được sắp xếp theo thứ tự có thể có các bản sao;

    • !!set
      Một chuỗi các giá trị không có thứ tự và không bằng nhau;

    • !!seq
      Một chuỗi các giá trị tùy ý;

    Bạn sẽ nhận ra một số cấu trúc này từ Java! :) Điều này có nghĩa là các cấu trúc dữ liệu khác nhau từ các ngôn ngữ lập trình có thể được tuần tự hóa thành YAML.

  4. Khả năng sử dụng neo và bí danh

    Các điểm đánh dấu này cho phép bạn xác định một số phần tử trong tệp YAML, sau đó tham chiếu phần tử đó trong phần còn lại của tệp nếu nó xảy ra nhiều lần. Một neo được tạo bằng ký hiệu & và bí danh được tạo bằng * .

    Giả sử chúng ta có một tệp mô tả sách của Leo Tolstoy. Để tránh viết ra tên tác giả cho mỗi cuốn sách, chúng ta chỉ cần tạo mỏ neo leo núi và gọi nó bằng bí danh khi cần:

    books:
     book-1:
       title: War and Peace
       author: &leo Leo Tolstoy
       year: 1869
    
     book-2:
       title: Anna Karenina
       author: *leo
       year: 1873
    
     book-3:
       title: Family Happiness
       author: *leo
       year: 1859

    Khi tệp này được phân tích cú pháp, giá trị "Leo Tolstoy" được thay thế ở đúng nơi chúng tôi có bí danh của mình.

  5. YAML có thể nhúng dữ liệu ở các định dạng khác. Ví dụ: JSON:

    books: [
            {
              "title": "War and Peace",
              "author": "Leo Tolstoy",
              "year": 1869
            },
    
            {
              "title": "Anna Karenina",
              "author": "Leo Tolstoy",
              "year": 1873
            },
    
            {
              "title": "Family Happiness",
              "author": "Leo Tolstoy",
              "year": 1859
            }
          ]

Các định dạng tuần tự hóa khác

XML

Định dạng này dựa trên cây thẻ.
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Mỗi phần tử bao gồm một thẻ mở và thẻ đóng (<> và </>). Mỗi phần tử có thể có các phần tử lồng nhau. XML là một định dạng phổ biến cũng tốt như JSON và YAML (nếu chúng ta đang nói về các dự án thực tế). Chúng ta có một bài học riêng về XML .

BSON (JSON nhị phân)

Như tên gọi của nó, BSON rất giống với JSON, nhưng nó không thể đọc được bằng con người và sử dụng dữ liệu nhị phân. Do đó, nó rất tốt cho việc lưu trữ và truyền hình ảnh cũng như các tệp đính kèm khác. Ngoài ra, BSON hỗ trợ một số kiểu dữ liệu không có trong JSON. Ví dụ: tệp BSON có thể bao gồm ngày (ở định dạng mili giây) hoặc thậm chí là một đoạn mã JavaScript. Cơ sở dữ liệu MongoDB NoSQL phổ biến lưu trữ thông tin ở định dạng BSON.

Giao thức dựa trên vị trí

Trong một số tình huống, chúng tôi cần giảm mạnh lượng dữ liệu được gửi (ví dụ: nếu chúng tôi có nhiều dữ liệu và cần giảm tải). Trong tình huống này, chúng ta có thể sử dụng giao thức dựa trên vị trí, nghĩa là gửi các giá trị tham số mà không có tên của chính các tham số đó.
"Leo Tolstoy" | "Anna Karenina" | 1873
Dữ liệu ở định dạng này chiếm dung lượng ít hơn nhiều lần so với tệp JSON đầy đủ. Tất nhiên, có các định dạng tuần tự hóa khác, nhưng bạn không cần phải biết tất cả chúng ngay bây giờ :) Thật tốt nếu bạn đã quen thuộc với các định dạng tiêu chuẩn ngành hiện tại khi phát triển ứng dụng và ghi nhớ những ưu điểm của chúng cũng như sự khác biệt của chúng với định dạng này. khác. Và như vậy, bài học của chúng ta đã kết thúc :) Đừng quên giải quyết một số nhiệm vụ hôm nay! Cho đến lần sau! :)
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào