序列化:将字节转换为字节?

时间:2015-12-04 18:50:16

标签: java serialization network-programming

对象本身是一个字节序列,它是机器如何理解所有数据,无论是对象,文本,图像......等等。你能否为我清楚这个想法为什么我们要将一个字节序列(对象)转换成另一个字节?我们在进行序列化时是否重构字节,或者制作一个包含此对象的模板,以便在通过网络传输时赋予其特殊含义?假设某个方法从内存中取出对象,并将该对象放入IP数据报并通过网络发送,可能出现什么问题?

3 个答案:

答案 0 :(得分:2)

  

首先:压缩。

您必须明白,磁盘上的映像文件和从内存渲染的映像文件 - 不一样。在磁盘上,它们(通常是忘记BMP)被压缩。利用当前的网络吞吐量和硬盘驱动器的容量,压缩是必不可少的。

  

第二:架构。

内存中的数字只是一个位序列,是的。但是,什么位数被算作数字? 8? 16? 32? 64?任何一位。有字节,单词,整数,长整数,浮点数(地狱,浮点数!)和其他几十个。投球者也很重要,所谓的大端和小端。因此,一台(x86)机器上的123456789与另一台机器上的数字不同(例如x64)。

  

第三种:文件(读取:传输)格式!=对象内存格式。

嗯,文件(或网络数据包)中的数据结构与从内存中的该文件加载的对象之间存在差异。此外,对象内存结构可能因程序版本而异。 Win 3.1中加载到内存的图像,甚至Vista,Vista都是一个很大的区别。此外,结构包装和4,8,16,32位边界对齐等,等等。

答案 1 :(得分:1)

对象本身包含许多引用,它们指向对象的另一个组件在此特定时刻在此特定计算机上的内存中恰好存在的位置。关键点序列化的一个原因是它将对象转换为可以在其他时间读取的字节,可能在某些其他机器上。

此外,内存中的对象表示针对快速访问和修改进行了优化,不一定采用最小字节数。一些序列化协议,特别是用于RPC或数据存储的序列化协议,优化了使用压缩算法传输或存储多少字节,这使得访问或修改对象的属性变得更加困难,以换取使用更少的字节来执行它

答案 2 :(得分:0)

  

对象本身是一个字节序列

没有。对象本身不是只是一个'字节序列',除非它只包含原始数据。它可以包含

  • 对其他对象的引用
  • 这些对象可能已经被序列化,在这种情况下,需要序列化反向引用,而不是重新引用对象
  • 这些引用可能为null
  • 根本没有对象,只是原始数据

所有这些都增加了任务的复杂性,远远超出了仅仅序列化“一系列字节”的天真概念。