JavaRush /Blog Java /Random-VI /Các định dạng tuần tự hóa trong Java

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

Xuất bản trong nhóm
Xin chào! Hãy nói về tuần tự hóa trong Java. Bạn có thể nhớ rằng chúng tôi đã có bài giảng về việc xuất bản nhiều kỳ. Đúng rồi :) Đây là bài đầu tiên Và đây là bài thứ hai Nếu bạn không nhớ rõ cách thức hoạt động của tuần tự hóa, tại sao nó lại cần thiết và có những công cụ nào dành cho nó trong Java, bạn có thể đọc lướt qua các bài giảng này. Bài giảng hôm nay sẽ mang tính lý thuyết và trong đó chúng ta sẽ xem xét kỹ hơn về các định dạng tuần tự hóa. Các định dạng tuần tự hóa trong Java - 1Đầu tiên, hãy nhớ serialization 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 thành một chuỗi byte. Deserialization là quá trình xây dựng lại một đối tượng từ các byte này. Một đối tượng Java có thể được tuần tự hóa và truyền qua mạng (ví dụ: sang một máy tính khác). Vì vậy, cùng một chuỗi byte này có thể được biểu diễn ở các định dạng khác nhau. Bạn đã quen với điều này từ việc sử dụng máy tính hàng ngày. Ví dụ: sách điện tử (hoặc tài liệu văn bản đơn giản) bạn đang đọc 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 trong các thiết bị Amazon Kindle);
  • và nhiều hơn nữa (ePub, djvu, fb2...).
Có vẻ như nhiệm vụ giống nhau: trình bày văn bản ở dạng người có thể đọc được. Nhưng mọi người đã phát minh ra rất nhiều định dạng. Ngay cả khi 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 việc này được thực hiện là có lý do. Mỗi người trong số họ có lẽ đều có những ưu điểm và nhược điểm riêng so với những người khác. Có lẽ các định dạng tuần tự hóa được tạo ra theo cùng một nguyên tắc? Vâng, đoán đúng đấy, sinh viên! :) Nó là như vậy. Thực tế là việc truyền dữ liệu đi xa là một việc khá tế nhị và có rất nhiều yếu tố trong đó. Ai truyền dữ liệu? Ở đâu? Khối lượng gì? Bên nhận sẽ là người hay máy (tức là dữ liệu có thể đọc được bằng con người)? Loại thiết bị nào sẽ đọc dữ liệu? Rõ ràng, các tình huống là khác nhau. Đó là một điều khi bạn cần chuyển hình ảnh 500KB từ điện thoại thông minh này sang điện thoại thông minh khác. Và nó hoàn toàn khác khi chúng ta đang nói về 500 terabyte dữ liệu kinh doanh cần được nén hiệu quả nhất có thể, đồng thời được truyền đi nhanh nhất có thể. Chúng ta hãy xem các định dạng tuần tự 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 đã có chút quen thuộc với anh ấy rồi! Chúng ta đã nói về vấn đề này trong bài giảng này và chúng ta đã xem xét việc tuần tự hóa trong JSON tại đây . Nó có tên như vậy là có lý do. Các đối tượng Java được chuyển đổi sang JSON thực sự trông giống hệt các đối tượng JavaScript. Bạn không cần phải biết JavaScript để hiểu ý nghĩa của đối tượng của chúng tôi:
{
   "title": "Война и мир",
   "author": "Лев Толстой",
   "year": 1869
}
Không cần thiết phải vượt qua một đối tượng. JSON cũng có thể chứa một mảng đối tượng:
[
 {
   "title": "Война и мир",
   "author": "Лев Толстой",
   "year": 1869
 },

 {
   "title": "Бесы",
   "author": "Федор Достоевский",
   "year": 1872
 },

 {
   "title": "Чайка",
   "author": "Антон Чехов",
   "year": 1896
 }
]
Vì JSON là một đối tượng JavaScript nên nó hỗ trợ các định dạng dữ liệu JavaScript sau:
  • dây;
  • số (số);
  • đồ vật (đối tượng);
  • mảng (mảng);
  • giá trị boolean (đúng và sai);
  • vô giá trị.
JSON có lợi thế 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ụ: máy chủ của bạn lưu trữ cơ sở dữ liệu về lịch trình chuyến bay. Một khách hàng yêu cầu dữ liệu từ cơ sở dữ liệu này bằng ứng dụng web khi ngồi ở nhà trước máy tính. 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. Bạn có thể nói nó cơ bản :) Ở trên chúng tôi đã đưa ra ví dụ về hai tệp JSON. Và ngay cả khi bạn chưa bao giờ nghe nói về sự tồn tại của JavaScript (chưa nói đến các đối tượng của nó), bạn vẫn có thể dễ dàng hiểu loại đối tượng nào được mô tả ở đó.
    Toàn bộ tài liệu JSON là một trang web có một vài hình ảnh.

  3. Phổ biến rộng rãi. JavaScript là ngôn ngữ giao diện người dùng chiếm ưu thế và nó đưa ra các điều khoản của nó. 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 thư viện đã được viết để làm việc với JSON cho tất cả các ngôn ngữ lập trình có thể.

Ví dụ: bạn đã làm việc với thư viện Jackson trong bài giảng nơi 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 còn có GSON - một thư viện rất tiện lợi của Google.

YAML

Khi bắt đầu tồn tại, nó là viết tắt của Yet Another Markup Language - “một ngôn ngữ đánh dấu khác”. Vào thời điểm đó, nó được định vị là đối thủ cạnh tranh với XML. Bây giờ, sau một thời gian, nó là viết tắt của “YAML Ain't Markup Language” (“YAML không phải là ngôn ngữ đánh dấu”). tính cách anh ta như thế nào? Hãy tưởng tượng rằng chúng ta cần tạo 3 lớp nhân vật cho trò chơi trên máy tính của mình: Chiến binh, Pháp sư và Kẻ trộm. Họ sẽ có những đặc điểm sau: sức mạnh, sự nhanh nhẹn, sức bền và một bộ vũ khí. Tệp YAML của chúng tôi với các mô tả lớp sẽ trông như thế này:
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 vào các phần tử khác. Chúng ta 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 để biểu thị từng cấp độ. Định dạng YAML có những ưu điểm gì?
  1. Con người có thể đọc được. Một lần nữa, ngay cả khi bạn thấy tệp yaml không có mô tả, bạn vẫn có thể dễ dàng hiểu được những đối tượng nào được mô tả trong đó. YAML dễ đọc đến mức nào mà trang chính của yaml.org là một tệp yaml thông thường :)

  2. Sự nhỏ gọn. Cấu trúc tệp được hình thành bởi 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 có nguồn gốc từ ngôn ngữ lập trình. Ưu điểm rất lớn của YAML so với JSON và nhiều định dạng khác là nó hỗ trợ các cấu trúc dữ liệu khác nhau. Trong số đó:

    • !!map
      Một tập hợp các cặp khóa:giá trị không có thứ tự và không có khả năng trùng lặp;

    • !!omap
      Một chuỗi các cặp khóa:giá trị được sắp xếp theo thứ tự không có khả năng 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ó khả năng trùng lặp;

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

    • !!seq
      Chuỗi giá trị tùy ý;

    Một số cấu trúc này sẽ quen thuộc với bạn khi sử dụng Java! :) Nhờ tính năng này, bạn có thể tuần tự hóa nhiều cấu trúc dữ liệu khác nhau từ các ngôn ngữ lập trình sang định dạng YAML.

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

    Bản dịch của các từ "neo" và "bí danh" - "neo" và "bút danh". Về nguyên tắc, nó mô tả khá chính xác bản chất của các thuật ngữ này trong YAML.

    Chúng cho phép bạn xác định một phần tử trong tệp yaml và 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. Điểm 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ả về sách của Leo Tolstoy. Để tránh viết tên tác giả theo cách thủ công mỗi lần, chúng ta chỉ cần tạo một mỏ neo "leo" và tham chiếu nó bằng bí danh khi chúng ta 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 chúng tôi đọc tệp này bằng một số trình phân tích cú pháp, giá trị “Leo Tolstoy” sẽ được thay thế vào đúng vị trí thay cho bí danh của chúng tôi.

  5. Bạn có thể nhúng dữ liệu ở các định dạng khác trong YAML. 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ái gọi là 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, không thua kém gì JSON và YAML (nếu nói về việc sử dụng trong các dự án thực tế). Chúng tôi có một bài giảng riêng về XML .

BSON (JSON nhị phân)

Đúng như tên gọi, nó rất giống với JSON, nhưng con người không thể đọc được và hoạt động trên dữ liệu ở định dạng nhị phân. Điều này làm cho nó rất thuận tiện cho việc lưu trữ và chuyể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ố loại dữ liệu không có trong JSON. Ví dụ: bạn có thể viết ngày (ở định dạng mili giây) hoặc thậm chí một đoạn mã JavaScript vào tệp BSON. Cơ sở dữ liệu NoSQL phổ biến MongoDB lưu trữ thông tin ở định dạng BSON.

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

Trong một số trường hợp, chúng ta cần giảm đáng kể lượng dữ liệu được truyền (ví dụ: nếu có nhiều dữ liệu và chúng ta 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à truyền các giá trị tham số mà không cần 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 ít dung lượng hơn nhiều so với tệp JSON chính thức. 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 khi làm quen với các định dạng hiện là tiêu chuẩn ngành để phát triển ứng dụng và ghi nhớ những ưu điểm cũng như sự khác biệt của chúng với nhau . Và bài giảng của chúng ta đã kết thúc :) Đừng quên giải một số bài toán hôm nay nhé! Hẹn gặp lại! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION