为什么我们需要使用序列化?
如果我们想通过网络发送一个对象或一段数据,我们可以使用字节流。
如果我们想将一些数据保存到磁盘我们可以再次使用二进制模式以及字节流并保存它。
那么使用序列化有什么好处呢?
6 回答
从技术上讲,您的序列化对象也将最终成为电缆或文件系统上的字节流......
因此,您也可以将其视为将对象转换为字节流的标准化且已经可用的方法。存储/传输对象是一个非常普遍的需求,在每个应用程序中重新发明这个轮子几乎没有意义。
正如其他人所提到的,您也知道这个 object->stream_of_bytes 实现非常健壮、经过测试并且通常独立于体系结构。
这并不意味着它是保存或传输对象的唯一可接受的方式:在某些情况下,您必须实现自己的方法,例如避免保存不必要的/私有成员(例如出于安全或性能原因)。但是,如果您是在一个简单的情况下,您可以通过使用框架、语言或 VM 的序列化/反序列化来让您的生活更轻松,而不必自己实现它。
希望这可以帮助。
在架构之间兼容的其他原因。从一个架构到另一个架构,有时从一个编译器到另一个编译器,整数的字节数不同。
另外,您所说的仍然是序列化。二进制序列化。您将对象的所有字节放在一起,以便存储它们并在以后将它们重新转换为对象。这是序列化。
有关维基百科的更多信息
Designing Data Intensive Applications
从书中引用:
程序通常以(至少)两种不同的表示形式处理数据:
- 在内存中,数据保存在对象、结构、列表、数组、哈希表、树等中。这些数据结构针对 CPU 的高效访问和操作进行了优化(通常使用指针)。
- 当您想将数据写入文件或通过网络发送时,您必须将其编码为某种自包含的字节序列(例如,JSON 文档)。由于指针对任何其他进程都没有意义,因此这种字节序列表示看起来与通常在内存中使用的数据结构完全不同。因此,我们需要在两种表示之间进行某种转换。从内存中的表示到字节序列的转换称为编码(也称为序列化或编组),反向称为解码(解析、反序列化、解组)。
序列化是将对象转换为流的过程,以便可以将其保存在任何物理文件中,例如(XML)或可以保存在数据库中。C#中序列化的主要目的是持久化一个对象并将其保存在任何指定的存储介质中,如流、物理文件或数据库。
一般来说,序列化是一种保持对象状态的方法,但我建议你阅读这个 wiki 页面,我认为它非常详细和正确:
在序列化中,重点不是将对象转换为位和字节,对象已经是位和字节。序列化是使对象的“状态”持久化的过程。注意“状态”这个词,它表示整个对象图(目标对象和它直接或间接引用的所有对象)的实例变量的值,没有方法和其他额外的运行时东西粘在它们上面(当然还有JVM 恢复这些对象所需的更多信息,例如它们的类类型)。
所以这是它必要的主要原因:存储对象的整个字节会很昂贵,而且出于所有意图和目的,都是不必要的。