Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么发送数据需要序列化?_Javascript_Json_Serialization_Deserialization - Fatal编程技术网

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

Javascript 为什么发送数据需要序列化?,javascript,json,serialization,deserialization,Javascript,Json,Serialization,Deserialization,我一直在阅读JSON和序列化,据我所知,JSON是一种经常用于通过网络传输数据的格式,例如从web服务器到web服务器或将数据存储到磁盘 数据可以是字符串、数字、对象等。我没有找到一个明确的解释来解释为什么需要序列化,例如,当将字符串发送到web服务器或将其保存到磁盘时,计算机是否已经将字符串存储为一系列位和字节,这不是数据的最基本形式吗?那么,为什么不能按原样发送/存储这些文件呢 为什么需要将其字符串化为JSON,即序列化,从而将其转换为字符串 说清楚一点,我在问为什么需要它,以及一个简单明了

我一直在阅读JSON和序列化,据我所知,JSON是一种经常用于通过网络传输数据的格式,例如从web服务器到web服务器或将数据存储到磁盘

数据可以是字符串、数字、对象等。我没有找到一个明确的解释来解释为什么需要序列化,例如,当将字符串发送到web服务器或将其保存到磁盘时,计算机是否已经将字符串存储为一系列位和字节,这不是数据的最基本形式吗?那么,为什么不能按原样发送/存储这些文件呢

为什么需要将其字符串化为JSON,即序列化,从而将其转换为字符串

说清楚一点,我在问为什么需要它,以及一个简单明了的解释


感谢

原因很简单,数据可以不同地存储在不同计算机的内存中,甚至可以通过同一台计算机上用不同编程语言编写的程序来存储


JSON等序列化格式为计算机或程序之间交换数据提供了一种定义的方式。

不是每个人都知道如何解析或解释这些位序列。有时,您需要一些通用的结构和格式,这些结构和格式可以传递给其他人,以便其他人理解您试图告诉他们的内容。

广义上讲,序列化有两个重要的、主要是独立的工作:

  • 将所有信息收集到一个单独的“数据块”(流)中,该数据块是自包含且
  • 将所有信息转换为商定的格式(通常为紧凑性或易于解析而优化)
  • #1非常重要,因为具有许多属性和子对象的单个对象可以分布在运行程序的内存中

    例如,JavaScript运行时可以有一个用于字符串常量的专用内存池。然后,使用某个常量作为键的对象将从其数据结构引用到该池中。这意味着对象不再位于内存中的单个独立块中:它分散在多个区域中。这种扩展实际上是一种常态:对象通常不直接包含复杂的数据,根据语言的不同,甚至“原始”值(如number)也可以存储为对内存中另一个位置的引用

    #2之所以重要,主要是因为用于快速访问内存中数据的格式可能不适合传输(因为它可能包含不必要的冗余或内存指针,在传输到另一台计算机时没有任何意义,这部分与reason#1有关)


    例如映射(或字典):内存中的表示通常涉及多个存储哈希值的存储桶以及这些存储桶中的某种冲突处理结构(例如,链表或树)。这种结构有助于有效地访问单独的键,但直接通过导线传输这种结构是毫无意义的:它非常容易重新构建,并且不能保证接收端使用完全相同的方式来表示地图。因此,我们只需发送每个键和相关值,让接收端重新构建高效访问所需的任何数据结构。

    true,您可以发送blob。为了公平起见,还需要将字符串(二进制)序列化为blob。注意:
    serialise!=stringify(文本格式)
    我认为JSON.stringify是一个函数,它将序列化您传入的内容,因此不确定您所说的
    是什么意思==注释我的意思是有二进制序列化。又称作stringify不是序列化的唯一方式。你能举个例子吗?我认为二进制位和字节在任何机器上都会转换成相同的东西。这更清楚一点,但在内存中分散的情况下,我仍然认为引用变量(例如某个数字)只会发送表示该数字的位,但我可以看到,将数据分块在一起会使事情变得更容易。那么这是否正确呢?每次您可能会将一些数据保存到文本文件或编辑的图像中,这些数据必须先序列化,然后才能存储到磁盘上?@jobe:您描述的“发送表示该数字的位”是一种序列化。“序列化”通常只是将数据结构转换为可通过流发送的内容的过程(即,作为字节的串行序列)。序列化可以生成二进制格式(例如protobuf)或文本格式(JSON是一个常见的示例)。我认为最终它必须是二进制格式,即使JSON最终也会作为0和1的二进制数据发送-因此,这不是一回事。在将数据存储到磁盘时也需要这样做吗?我理解您关于将数据结构转换为串行字节序列的回答,因为这样更容易将其组合在一起并发送/接收。我想这是比尝试在内存中发送每个位的最大好处。