CodeGym/Java 博客/随机的/Java 序列化格式
John Squirrels
第 41 级
San Francisco

Java 序列化格式

已在 随机的 群组中发布
个会员
你好!让我们谈谈序列化。您可能还记得我们已经上过有关序列化的课程。所以我们做到了 :) 这是第一个这是第二个. 如果您不太记得序列化是如何工作的,为什么需要序列化,以及 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 文件少几倍。当然,还有其他的序列化格式,但你现在不需要知道所有的:) 如果你在开发应用程序时熟悉当前的行业标准格式,并记住它们的优点以及它们与其他格式的不同之处,那就太好了其他。至此,我们的课程结束了:) 今天别忘了解决几个任务!直到下一次!:)
评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论