为什么发送数据需要序列化?

3
我一直在研究JSON和序列化,据我了解,JSON是一种常用于在网络上传输数据(例如从/到Web服务器)或将数据存储到磁盘中的格式。
这些数据可以是字符串、数字、对象等。至于为什么需要序列化,我还没有找到一个清晰的解释。例如,当向Web服务器发送字符串或将其保存到磁盘时,计算机不是已经将字符串存储为位和字节的系列吗?这不是数据的最基本形式吗?那么为什么不能将它们发送/存储为它们本来的样子呢?
为什么需要将其转换为JSON字符串,即序列化,这会将其转换为字符串?
明确一下,我想知道为什么需要这样做,并希望得到一个简单明了的解释。
谢谢。

没错,你可以发送二进制大块数据。这并不罕见。 - undefined
为了公平起见,您也需要将字符串序列化为二进制大对象(blob)。 - undefined
请将英文翻译成中文。只返回翻译后的文本内容:注意:serialise != stringify(text format) - undefined
我以为JSON.stringify是一个可以将你传入的内容序列化的函数,所以不太确定你在!==注释中所指的是什么意思。 - undefined
好吧,让我们来说说如何将链表存储到文件中。 - undefined
显示剩余3条评论
3个回答

2
总的来说,序列化有两个重要的、大多数独立的作用:
1. 将所有信息收集到一个自包含的数据块(流)中。 2. 将所有信息转换为一种约定的格式(通常针对紧凑性或易于解析进行了优化)。
#1 之所以重要,是因为一个具有许多属性和子对象的单个对象可能分散在运行程序的整个内存中。
例如,JavaScript 运行时可以有一个专用的内存池,用于字符串常量。然后一个使用某个常量作为键的对象只需从其数据结构中引用该池。这意味着对象不再位于单个自包含的内存块中:它分散在多个区域中。这种分散实际上是正常情况:对象通常不直接包含复杂数据,而且根据语言,甚至“原始”值(如数字)也可以存储为对内存中另一个位置的引用。
#2 的重要性主要在于,用于快速访问内存中的数据的格式可能不适合传输(因为它可能包含不必要的冗余或在传输到另一台计算机时没有任何意义的内存指针,这部分与原因 #1 有关)。
一个例子就是地图(或字典):内存中的表示通常会涉及多个桶,这些桶保存了哈希值和一些冲突处理结构(例如链表或树)。该结构有助于高效访问不同的键,但是直接通过网络传输该结构是没有意义的:重新构建很容易,并且不能保证接收端使用完全相同的方式来表示地图。因此,我们只发送每个键和相关联的值,让接收端处理重建任何需要用于高效访问的数据结构。

谢谢,这样清楚了一些。但是在数据分散在内存中的情况下,我仍然认为对于一个变量的引用,比如指向某个数字的引用,只会发送表示该数字的位,但我可以看到将数据分块在一起会使事情更容易。所以,这样理解是否正确:每次你可能要将一些数据保存到文本文件或编辑图像时,这些数据必须先进行序列化才能存储到磁盘上? - undefined
@jobe:你所描述的“发送表示该数字的位”实际上就是一种序列化。一般来说,“序列化”只是将数据结构转换为可以通过流发送的内容的过程(即作为字节的串行序列)。序列化可以产生二进制格式(例如protobuf)或文本格式(JSON是一个常见的例子)。 - undefined
我认为最终它总是得是二进制格式,即使JSON最终也会以0和1的二进制数据形式发送 - 所以最终不就是一回事吗?同时,存储数据到磁盘时是否总是需要这样做呢? - undefined
我理解了你关于将数据结构转换为字节序列的回答,因为这样更容易将它们组合在一起并进行发送/接收。我猜这就是相对于尝试在内存中发送每个单独的位的巨大优势。 - undefined

1
简单的原因是数据可以在不同的计算机上以不同的方式存储在内存中,甚至可以由同一台计算机上使用不同编程语言编写的程序进行存储。
像JSON这样的序列化格式为计算机或程序之间的数据交换提供了明确定义的方式。

请举个例子好吗?我以为二进制的位和字节在任何使用它们的机器上都会翻译成相同的东西。 - undefined

0

并不是每个人都知道如何解析或解释那些一系列的比特位。有时候你需要一些通用的结构、一些格式,可以传递给其他人,让他们理解你试图告诉他们的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接