【问题标题】:Serialization: Converting bytes to bytes?序列化:将字节转换为字节?
【发布时间】:2015-12-04 18:50:15
【问题描述】:
对象本身是一个字节序列,这就是机器如何理解所有数据的方式,无论是对象、文本、图像……等等。你能帮我弄清楚为什么我们要将字节序列(对象)转换为另一个字节吗?当我们进行序列化时,我们是重新构造字节,还是制作一个模板来保存这个对象,以便在通过网络传输时赋予它特殊的含义?假设某种方法,从内存中取出对象,并将该对象放入 IP 数据报并通过网络发送,可能会出现什么问题?
【问题讨论】:
标签:
java
serialization
network-programming
【解决方案1】:
首先:压缩。
您必须了解,磁盘上的图像文件和从内存中渲染的图像文件 - 是不一样的。在磁盘上,它们(通常,忘记 BMP)是压缩的。以当前的网络吞吐量和硬盘容量,压缩是必不可少的。
第二:架构。
内存中的数字只是一个位序列,是的。但是,多少位计数算作数字? 8? 16? 32? 64?任何一位。有字节,字,整数,长整数,浮点数(地狱,浮点数!)和另外几十个。并且位序也很重要,即所谓的大端和小端。因此,一台 (x86) 机器上的 123456789 与另一台机器(例如 x64)上的数字不同。
第三:文件(读取:传输)格式!= 内存中的对象格式。
好吧,文件(或网络数据包)中的数据结构与从该文件加载到内存中的对象时存在差异。此外,内存中的对象结构可能因程序版本而异。 Win 3.1 中的加载到内存的图像和,例如,Vista 是天壤之别。此外,结构打包和 4、8、16、32 位边界对齐等。
【解决方案2】:
对象本身包含许多引用,它们是指向对象的另一个组件在此特定时刻恰好存在于该特定机器上的内存中的位置的指针。序列化的关键在于它将对象转换为可以在其他时间读取的字节,可能在其他机器上。
此外,内存中的对象表示已针对快速访问和修改进行了优化,不一定占用最少的字节数。一些序列化协议,特别是用于 RPC 或数据存储的序列化协议,使用压缩算法优化必须传输或存储的字节数,这使得访问或修改对象的属性变得更加困难,以换取使用更少的字节来完成它.
【解决方案3】:
对象本身就是一个字节序列
没有。对象本身不只是一个“字节序列”,除非它只包含原始数据。它可以包含
- 对其他对象的引用
- 这些对象可能已经被序列化,在这种情况下需要序列化反向引用,而不是重新序列化引用的对象
- 这些引用可能为空
- 可能根本没有对象,只有原始数据
所有这些都大大增加了任务的复杂性,远远超出了仅序列化“字节序列”的幼稚概念。