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