JavaRush /Java Blog /Random-TW /Java 中的序列化格式

Java 中的序列化格式

在 Random-TW 群組發布
你好!我們來談談Java中的序列化。您可能還記得我們已經有過關於連載的講座。沒錯 :) 這是第一個 這是第二個 如果您不太記得序列化是如何工作的、為什麼需要它以及 Java 中有哪些工具,您可以瀏覽一下這些講座。今天的講座將是理論性的,在其中我們將仔細研究序列化格式。Java 中的序列化格式 - 1首先,讓我們記住什麼是序列化。序列化是將物件的狀態儲存到位元組序列中的過程。反序列化是從這些位元組重建物件的過程。Java 物件可以被序列化並透過網路傳輸(例如,傳輸到另一台電腦)。因此,相同的位元組序列可以用不同的格式表示。您在日常電腦使用中對此很熟悉。例如,您正在閱讀的電子書(或簡單的文字文件)可以用多種不同的格式編寫:
  • docx(微軟Word格式);
  • pdf(Adobe 格式);
  • mobi(常用於亞馬遜 Kindle 裝置);
  • 還有更多(ePub、djvu、fb2...)。
任務似乎是相同的:以人類可讀的形式呈現文本。但人們發明了一大堆格式。即使不深入研究他們的工作細節,我們也可以假設這樣做是有原因的。與其他人相比,它們每個人可能都有自己的優點和缺點。也許序列化格式是根據相同的原理創建的?嗯,猜得好,學生!:) 事情是這樣的。事實上,遠距離傳輸資料是一件相當微妙的事情,其中​​有很多因素。誰傳輸資料?在哪裡?什麼體積?接收方是人還是機器(即資料應該是人類可讀的)?什麼樣的設備會讀取資料?顯然,情況有所不同。當您需要將 500KB 的圖像從一部智慧型手機傳輸到另一部智慧型手機時,這是一回事。當我們談論需要盡可能有效率地壓縮並同時盡快傳輸的 500 TB 業務資料時,情況就完全不同了。讓我們來看看主要的序列化格式,並看看每種格式的優缺點!

JSON

JavaScript 物件表示法。你對他已經有點熟悉了!我們在本次講座中討論了它,並且在這裡研究了 JSON 中的序列化。它得名是有原因的。轉換為 JSON 的 Java 物件實際上看起來與 JavaScript 物件一模一樣。你不需要了解 JavaScript 來理解我們物件的意義:
{
   "title": "Война и мир",
   "author": "Лев Толстой",
   "year": 1869
}
沒有必要傳遞一個物件。JSON 也可以包含物件數組:
[
 {
   "title": "Война и мир",
   "author": "Лев Толстой",
   "year": 1869
 },

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

 {
   "title": "Чайка",
   "author": "Антон Чехов",
   "year": 1896
 }
]
由於 JSON 是 JavaScript 對象,因此它支援以下 JavaScript 資料格式:
  • 字串;
  • 數字(數字);
  • 對象(對象);
  • 數組(數組);
  • 布林值(true 和 false);
  • 無效的。
JSON 有什麼優點?
  1. 人類可讀的格式。如果您的最終用戶是人類,這是一個明顯的優勢。例如,您的伺服器儲存包含航班時刻表的資料庫。人類客戶端坐在家裡的電腦前,使用 Web 應用程式從該資料庫請求資料。由於您需要以他可以理解的格式提供數據,因此 JSON 是一個很好的解決方案。

  2. 簡單。你可以說它是基本的:)上面我們給了兩個 JSON 檔案的範例。即使您從未聽說過 JavaScript 的存在(更不用說它的物件),您也可以輕鬆理解其中描述的物件類型。
    整個 JSON 文件是一個帶有幾張圖片的網頁。

  3. 廣泛。JavaScript 是主導的前端語言,它決定了它的術語。使用 JSON 是必須的。因此,大量的Web服務使用JSON作為交換資料的格式。每個現代 IDE 都支援 JSON 格式(包括 Intellij IDEA)。已經為所有可能的程式語言編寫了一堆用於使用 JSON 的程式庫。

例如,您已經在講座中使用了 Jackson 庫,我們學習了將 Java 物件序列化為 JSON。但除了 Jackson 之外,還有GSON——來自 Google 的一個非常方便的庫。

YAML

在它出現之初,它代表 Yet Another Markup Language——「另一種標記語言」。當時它被定位為 XML 的競爭對手。現在,隨著時間的推移,它代表“YAML Ain't Markup Language”(“YAML 不是標記語言”)。他是什麼樣的人?假設我們需要為我們的電腦遊戲創建 3 個角色類別:戰士、法師和小偷。他們將具有以下特徵:力量、敏捷、耐力和一套武器。帶有類別描述的 YAML 檔案如下所示:
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
YAML 檔案具有樹狀結構:某些元素會嵌套在其他元素內。我們可以透過使用一定數量的空格來表示每個層級來控制嵌套。YAML格式有什麼優點?
  1. 人類可讀。同樣,即使您看到沒有描述的 yaml 文件,您也可以輕鬆了解其中描述的對象。YAML 是人類可讀性的體現, yaml.org的主頁是一個常規的 yaml 檔案:)

  2. 緊湊。檔案結構由空格組成:無需使用括號或引號。

  3. 支援程式語言原生的資料結構。與 JSON 和許多其他格式相比,YAML 的一個巨大優勢是它支援不同的資料結構。他們之中:

    • !!map
      鍵:值對的無序集合,不可能重複;

    • !!omap
      鍵:值對的有序序列,不可能重複;

    • !!pairs:
      鍵:值對的有序序列,可能存在重複;

    • !!set
      彼此不相等的無序值序列;

    • !!seq
      任意值的序列;

    您在 Java 中會熟悉其中一些結構!:) 由於此功能,您可以將程式語言中的各種資料結構序列化為 YAML 格式。

  4. 能夠使用錨點和別名

    「錨」和「別名」一詞的翻譯 - “錨”和“化名”。原則上,它相當準確地描述了 YAML 中這些術語的本質。

    它們允許您識別 yaml 檔案中的元素,並在該元素重複出現時在檔案的其餘部分中引用它。錨點是使用符號創建的&,別名是使用創建的*

    假設我們有一個包含列夫·托爾斯泰書籍描述的文件。為了避免每次手動寫入作者姓名,我們只需建立一個錨點“leo”,並在需要時使用別名引用它:

    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

    當我們使用某些解析器讀取此檔案時,值「Leo Tolstoy」將在正確的位置取代我們的別名。

  5. 您可以在 YAML 中嵌入其他格式的資料。例如,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
            }
          ]

其他序列化格式

XML

這種格式是基於所謂的標籤樹。
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
每個元素都包含一個開始和結束標記(<> 和 </>)。每個元素都可以有嵌套元素。XML是一種通用格式,不遜色於JSON和YAML(如果我們談論在實際專案中的使用)。我們有一個關於 XML 的單獨講座

BSON(二進位 JSON)

顧名思義,它與 JSON 非常相似,但人類不可讀,並以二進位格式操作資料。這使得儲存和傳輸圖像和其他配件變得非常方便。此外,BSON 支援一些 JSON 中不可用的資料類型。例如,您可以將日期(以毫秒格式)甚至一段 JavaScript 程式碼寫入 BSON 檔案中。流行的 NoSQL 資料庫 MongoDB 以 BSON 格式儲存資訊。

基於位置的協議

在某些情況下,我們需要大幅減少傳輸的資料量(例如,如果資料很多且我們需要減少負載)。在這種情況下,我們可以使用基於位置的協議,即傳遞參數值而不帶參數本身的名稱。
"Leo Tolstoy" | "Anna Karenina" | 1873
這種格式的資料比完整的 JSON 檔案佔用的空間少得多。當然,還有其他序列化格式,但您現在不需要了解它們:) 熟悉現在成為應用程式開發行業標準的格式並記住它們的優點和彼此之間的差異是有好處的。我們的講座已經結束了:)今天別忘了解決幾個問題!再見!:)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION