我们不能只获取要序列化的对象的 RAM 内存转储吗?

Can't we just take RAM memory dump of object to be serialized?

当我们必须将对象保存在持久性存储中或通过网络传输时,我们将对象序列化(在这种情况下,对象应实现可序列化接口)。我的问题是为什么有对象 class 应该实现可序列化接口的限制。我们不能通过按原样获取内存转储来序列化任何随机对象吗?

My question is why there is the restriction that the object class should implement serializable interface.

因为某些类型的 object 在 HotSpot JVM 中根本无法序列化。 class 的实例,例如 ThreadProcessSocketClass。 (在某些情况下,序列化是可以想象的,但不切实际。对于其他情况,这是不可想象的,因为 object 的行为取决于 Java 无法访问的状态。)

Can't we serialize any random object by taking its memory dump as it is.

有几个原因 spring 需要注意(假设我们正在讨论基于 HotSpot 的 JVM)。

  1. 上述 classes 的实例无法以这种方式正确序列化。
  2. 如果复制内存快照,则必须将其复制到目标地址中的相同地址space。否则指针将被破坏。
  3. 每个 object 都有一个 object header,其中包括对 object 的 class 的特殊引用。参考文献可能不同。
  4. 要复制包含 objects 的内存块,您需要在发送端和接收端以及所有其他应用程序线程禁用 GC。这将是一个停止世界的事件......在两端。
  5. 您要复制的 object不太可能分配在同一内存块中。

上面的一些问题可以用完全不同的 JVM 架构来解决,但也有一些更深层次的问题。 (此外,这种方法只能在“类似”的 JVM 实现之间工作。)

作为序列化/反序列化的实现方法是不实用的 Java objects.