CodeGym/Java Blog/Toto sisi/Java 序列化格式
John Squirrels
等級 41
San Francisco

Java 序列化格式

在 Toto sisi 群組發布
個成員
你好!讓我們談談序列化。您可能還記得我們已經上過有關序列化的課程。所以我們做到了 :) 這是第一個這是第二個. 如果您不太記得序列化是如何工作的,為什麼需要序列化,以及 Java 有哪些序列化工具,您可以瀏覽這些課程。今天的課程將是關於理論的。我們將仔細研究序列化格式。首先,讓我們回顧一下什麼是序列化。序列化是將對象的狀態存儲在字節序列中的過程。反序列化是從這些字節中恢復對象的過程。Java 對象可以序列化並通過網絡發送(例如,發送到另一台計算機)。字節序列可以用不同的格式表示。您從普通的計算機使用中熟悉這個概念。例如,一本電子書(或一個簡單的文本文檔)可以用多種不同的格式編寫:
  • docx(微軟 Word 格式);
  • pdf(Adobe 格式);
  • mobi(常用於亞馬遜 Kindle 設備);
  • 以及更多(ePub、djvu、fb2 等)。
在每種情況下,目標似乎都是相同的:以人類可讀的形式呈現文本。儘管如此,人們還是發明了許多不同的格式。無需深入了解他們的工作細節,我們就可以假設他們有充分的理由。與其他格式相比,每種格式都有自己的優點和缺點。也許各種序列化格式都是按照這些相同的原則創建的?優秀的猜測,學生!:) 完全正確。事實上,通過有線(或無線)方式發送數據是一件棘手的事情,涉及到很多因素。誰在發送數據?去哪兒?什麼音量?接收者是人還是計算機(即數據應該是人類可讀的)?什麼設備會讀取數據?顯然,這些情況是不同的。從一部智能手機向另一部智能手機發送 500 KB 圖像是一回事。如果我們談論的是 500 TB 的業務數據,必須以最佳方式壓縮並儘快發送,那就完全不同了。讓我們熟悉主要的序列化格式,並考慮每種格式的優缺點!

JSON

JavaScript 對象表示法。您已經對這種格式有所了解!我們在本課中談到了它,我們在這裡介紹了序列化為 JSON 。它得名是有原因的。轉換為 JSON 的 Java 對象實際上看起來與 JavaScript 中的對象完全一樣。你不需要了解 JavaScript 來理解我們的對象:
{
   "title": "War and Peace",
   "author": "Lev Tolstoy",
   "year": 1869
}
我們不限於發送單個對象。JSON 格式還可以表示對像數組:
[
 {
   "title": "War and Peace",
   "author": "Lev Tolstoy",
   "year": 1869
 },

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

 {
   "title": "The Seagull",
   "author": "Anton Chekhov",
   "year": 1896
 }
]
因為 JSON 表示 JavaScript 對象,所以它支持以下 JavaScript 數據格式:
  • 字符串;
  • 數字;
  • 對象;
  • 數組;
  • 布爾值(真和假);
  • 無效的。
JSON 有什麼好處?
  1. 人類可讀的格式。如果您的最終用戶是人類,這是一個明顯的優勢。例如,假設您的服務器有一個包含航班時刻表的數據庫。一位坐在家裡電腦前的人類客戶使用 Web 應用程序從該數據庫請求數據。因為你需要以他能理解的格式提供數據,JSON 是一個很好的解決方案。

  2. 簡單。非常簡單 :) 上面,我們給出了兩個 JSON 文件的示例。即使您沒有聽說過 JavaScript(更不用說 JavaScript 對象),您也可以輕鬆理解其中描述的對像類型。
    整個 JSON 文檔由一個帶有幾張圖片的網頁組成。

  3. 廣泛使用。JavaScript 是占主導地位的前端語言,它有自己的要求。使用 JSON 是必須的。因此,大量的 Web 服務使用 JSON 作為數據交換格式。每個現代 IDE 都支持 JSON 格式(包括 IntelliJ IDEA)。已經為各種編程語言編寫了一堆庫以支持使用 JSON。

例如,您已經在我們學習將 Java 對象序列化為 JSON 的課程中使用了 Jackson 庫。但是除了 Jackson,我們還有GSON,這是一個來自 Google 的非常方便的庫。

YAML

最初,YAML 代表“Yet Another Markup Language”。剛開始時,它被定位為 XML 的競爭對手。現在,隨著時間的推移,YAML 變成了“YAML Ain't Markup Language”的意思。究竟是什麼?假設我們需要創建 3 個類來表示計算機遊戲中的角色:Warrior、Mage 和 Thief。他們將擁有以下特徵:力量、敏捷、耐力、一套武器。這是描述我們的類的 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. 支持編程語言的本機數據結構。YAML 相對於 JSON 和許多其他格式的巨大優勢在於它支持各種數據結構。他們包括:

    • !!map
      一組無序的鍵值對,不能有重複項;

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

    • !!pairs:
      鍵值對的有序序列,可以有重複項;

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

    • !!seq
      任意值的序列;

    您會從 Java 中認出其中的一些結構!:) 這意味著來自編程語言的各種數據結構可以序列化為 YAML。

  4. 能夠使用錨點和別名

    這些標記允許您識別 YAML 文件中的某些元素,然後在文件的其餘部分重複出現時引用它。使用符號&創建錨點,使用*創建別名。

    假設我們有一個描述 Leo Tolstoy 書籍的文件。為了避免寫出每本書的作者姓名,我們只需創建 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)

顧名思義,BSON 與 JSON 非常相似,但它不是人類可讀的,並且使用二進制數據。因此,它非常適合存儲和傳輸圖像及其他附件。此外,BSON 還支持一些 JSON 不支持的數據類型。例如,一個 BSON 文件可以包含一個日期(毫秒格式)甚至一段 JavaScript 代碼。流行的 MongoDB NoSQL 數據庫以 BSON 格式存儲信息。

基於位置的協議

在某些情況下,我們需要大幅減少發送的數據量(例如,如果我們有大量數據並需要減少負載)。在這種情況下,我們可以使用基於位置的協議,即發送不帶參數本身名稱的參數值。
"Leo Tolstoy" | "Anna Karenina" | 1873
這種格式的數據佔用的空間比完整的 JSON 文件少幾倍。當然,還有其他的序列化格式,但你現在不需要知道所有的:) 如果你在開發應用程序時熟悉當前的行業標準格式,並記住它們的優點以及它們與其他格式的不同之處,那就太好了其他。至此,我們的課程結束了:) 今天別忘了解決幾個任務!直到下一次!:)
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言