序列化是将存储在内存中的对象转换为字节流,以便于在网络上传输、存储在数据库中等操作。
但是,对象不是已经以位和字节的形式存储在内存中了吗?为什么我们需要另一个过程将以字节表示的对象转换为另一种字节表示形式?难道我们不能直接通过网络传输对象吗?
我认为我可能对对象存储方式或访问对象字段的方式有所疏漏。
请有人帮助我澄清这个困惑吗?
序列化是将存储在内存中的对象转换为字节流,以便于在网络上传输、存储在数据库中等操作。
但是,对象不是已经以位和字节的形式存储在内存中了吗?为什么我们需要另一个过程将以字节表示的对象转换为另一种字节表示形式?难道我们不能直接通过网络传输对象吗?
我认为我可能对对象存储方式或访问对象字段的方式有所疏漏。
请有人帮助我澄清这个困惑吗?
这是《Java编程思想》一书中关于对象序列化的解释。
当您创建一个对象时,它存在的时间与您需要它的时间一样长,但在程序终止时,它不会存在。虽然这起初是有道理的,但在某些情况下,如果一个对象能够在程序没有运行时存在并保存其信息,那将非常有用。然后,下次启动程序时,该对象将存在,并且具有与上次运行程序时相同的信息。当然,您可以通过将信息写入文件或数据库来获得类似的效果,但为了使所有内容都成为对象,声明一个对象为“持久性”,并且让所有细节得到处理会非常方便。让我们以这种思维方式进行:我们按原样接收对象,并将其作为字节数组通过网络发送。另一个套接字/httphandler接收该字节数组。
现在,有两件事情值得考虑:
您还需要提供此数据。因此,仅针对此操作,我们需要额外的两个步骤。
现在,在C#和Java中,与C ++相反,对象分散在堆中,每个对象保存对它包含的对象的引用,因此现在我们有另一个要求
现在,我们得到了打包的字节数组,它表示某个对象层次结构,我们需要告诉另一侧如何将此字节数组解包回对象+它持有的对象
一些实体无法通过网络发送,例如函数。所以现在我们有了另一个步骤
这个过程会不断地进行,对于每个新的解决方案,你都会遇到很多问题。序列化是将你所谈论的字节数组转换为可以在其他环境中处理的内容,比如网络/文件。
Serializable
接口的类)只是其中一种方法。 - Andy Turner