'序列化'的概念完整的对象记忆

时间:2015-02-16 15:59:54

标签: performance serialization programming-languages

我想问一个关于技术概念的一般性问题,我不知道它是否存在或是否可行。

这个想法如下:

我有垃圾收集语言的对象(例如C#或Java)。对象本身可能包含多个对象,但不能引用任何不是对象子元素(或对象本身)的其他对象。 从理论上讲,可以获得此对象使用的内存,这很可能不是连接的内容。因为我对这些对象有一些了解,所以我可以找到所有引用变量/属性和指针,它们最终指向另一块内存(可能是间接的,取决于编程语言和虚拟机的实现)。我可以把这些内存组合成一个更大的内存(纠正引用/指针,使它们仍然完好无损)。这段内存,基本上是字节,可以写入存储器,例如数据库或redis缓存。在另一台机器上,我理论上可以再次加载此对象并将其放入虚拟机的内存中(如果它们是绝对的而不是相对的,则可能再次更正引用/指针)。然后我应该在另一个VM上拥有相同的对象。该对象可以像我想要的那样复杂,也可能包含事件或其他任何东西,我将能够将对象的状态转移到另一个VM(在另一台计算机上运行)。唯一的条件是它不包含对象之外的东西的引用。当然,我必须知道另一个VM上对象的类类型。

我问这个问题,因为我想分享一个对象的状态,我认为所有这些序列化工作只是一个开销,如果我可以冻结内存并传输到另一个VM,那将非常简单。

这样的事情是可能的,我会说是的,虽然它可能很复杂。也许由于他们的架构,一些VM是不可能的。在任何编程语言中都存在这样的东西吗?甚至可能在非垃圾收集语言中?

注意:除了编程语言之外,我不确定应该在这个问题中添加什么标签,我也不确定是否有更好的地方可以提出这样的问题。所以请原谅我。

修改

也许这个概念可以与Linux上的initrd或一般的休眠进行比较。

1 个答案:

答案 0 :(得分:1)

  1. 您必须收集对其他对象的所有引用。包括没有重复的对象(周期)图。这将需要某种“阻止世界”。至少对于序列化线程。有效但有可能很复杂 - 许多语言(java)的本机序列化机制正在为开发人员做这件事。
  2. 您将需要某种VM来从不同硬件架构中的字节顺序进行抽象。
  3. 您必须从任何环境中分离对象。你不能传递代表线程,文件句柄,套接字等的对象。你将如何检测它?
  4. 在现今系统内存是虚拟的,所以不可能简单地将地址从一台机器复制到另一台机器 - 你必须翻译它们
  5. 对象不仅是开发人员可见的数据,还有结构,沙箱信息,权限,超类,已加载的方法/类型以及由于优化和延迟加载而仍未加载的对象,垃圾收集器元数据等
  6. 您的对象/类的版本。在一台机器上,可以从源代码1创建类A,但在另一台机器上,所有已经可能是从版本2源构建的类A的对象
  7. 考虑到性能。它会比旧式序列化更快吗?它有什么好处?
  8. 可能还有很多我们没想过的事情
  9. 所以:我从来没有听说过这样的解决方案。它似乎在理论上可行,但由于某种原因,没有人这样做过。每个人都提供简单的程序化序列化。也许你会发现新的,更好的方式,但请记住,你会反对人群