序列化和普通对象存储之间的区别?

时间:2016-01-31 12:36:10

标签: java c# oop serialization

序列化是将存储在内存中的对象转换为要通过网络传输,存储在数据库等中的字节流的过程。

但是不是已经存储在内存中的对象是位和字节吗?为什么我们需要另一个进程将存储为字节的对象转换为另一个字节表示?我们不能直接通过网络传输对象吗?

我想我可能会遗漏对象存储在内存中的方式,或者访问对象字段的方式。

有人可以帮我解决这个混乱吗?

4 个答案:

答案 0 :(得分:3)

不同的系统不会以相同的方式将内容存储在内存中。明显的例子是字节序。

序列化定义了使用不同的内存中表示的系统可以通信的方式。

另一个重要的事实是对内存和序列化数据的要求可能不同:当需要内存时,快速读取(也可能是写入)访问;当序列化时,小尺寸是理想的。创建两种不同的格式以适应这两种用例比创建一种对两者都有好的格式更容易。

我想到的一个例子是LinkedHashMap:这在内存中基本上存储了两个版本的映射(一个用于捕获插入顺序;一个用作传统的哈希映射)。但是,您不需要这两种表示形式从序列化形式重建相同的地图:您只需要键/值对的插入顺序。因此,序列化表单不会存储与内存中表单相同的数据。

答案 1 :(得分:1)

序列化将来自内存的预先存在的字节转换为通用形式。

这样做是因为不同的系统以不同的方式分配内存。因此,我们无法确保可以直接从一台机器上的内存中保存对象,然后将其正确加载到另一台不同的机器中。

Mabe您可以在this page Oracle文档中找到更多信息。

答案 2 :(得分:0)

让我们按照这样的思路:我们按原样获取对象,然后通过网络将其作为字节数组发送。另一个socket / httphandler接收该字节数组。

现在,有两件事情浮现在脑海中:

  1. 要发送多少字节?
  2. 这些字节是什么?这些btyes代表哪个班级?
  3. 您也必须提供此数据。所以对于这个动作,我们需要额外的2个步骤。

    现在,在C#和Java中,与C ++相反,对象分散在堆中,每个对象都包含对它所包含的对象的引用,所以现在我们有了另一个要求

    1. recursivly“catch”所有内部对象并将它们打包到字节数组
    2. 现在我们得到压缩字节数组,代表一些对象层次,我们需要告诉对方如何将这个字节数组解包回对象+它所拥有的对象

      1. 发送有关如何将该字节数组解压缩到对象hirarchy的信息
      2. 无法通过网络发送一些obejct实体,例如函数。所以现在我们又迈出了一步

        1. 去掉那些无法序列化的东西,比如函数
        2. 这个过程继续进行,对于每个新的解决方案,你会发现很多问题。序列化是获取您正在讨论的字节数组并使其成为可以在其他环境(如网络/文件)中处理的过程。

答案 3 :(得分:0)

Thinking In Java 对象序列化的解释。

  

创建对象时,只要您需要它,它就会存在,但在程序终止时,它在任何情况下都不存在。虽然这首先是有意义的,但是在某些情况下,如果一个对象可以存在并且即使在程序没有运行时也能保存其信息,这将非常有用。然后,下次启动程序时,对象将在那里,它将具有与上次运行程序时相同的信息。当然,您可以通过将信息写入文件或数据库来获得类似的效果,但是本着将所有内容都设为对象的精神,将对象声明为“持久性”和##会非常方便。 34;并为您准备好所有细节。

     

Java的对象序列化允许您获取实现Serializable接口的任何对象,并将其转换为一个字节序列,以后可以完全恢复以重新生成原始对象。这在网络中甚至是正确的,这意味着序列化机制自动补偿操作系统的差异。也就是说,您可以在Windows机器上创建一个对象,将其序列化,然后通过网络将其发送到Unix机器,在那里它将被正确地重建。您不必担心不同机器上的数据表示,字节顺序或任何其他细节。

希望这会对你有所帮助。