JavaRush /Java 博客 /Random-ZH /Java 中的序列化格式

Java 中的序列化格式

已在 Random-ZH 群组中发布
你好!我们来谈谈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