Performance 概念';序列化';对象的完全记忆

Performance 概念';序列化';对象的完全记忆,performance,serialization,programming-languages,Performance,Serialization,Programming Languages,我想就一个技术概念提出一个非常笼统的问题,我不知道它是否存在或是否可行 其思路如下: 我有一个垃圾收集语言(例如C#或Java)中的对象。对象本身可能包含多个对象,但不引用不是对象(或对象本身)子元素的任何其他对象。 从理论上讲,可以得到这个对象使用的内存,它很可能不是一个连接件。因为我对对象有一些了解,所以我可以找到所有引用变量/属性和指针,这些变量/属性和指针最终指向另一块内存(可能是间接的,取决于编程语言和虚拟机的实现)。我可以将这些内存组合成更大的内存(更正引用/指针,使它们保持完整)。

我想就一个技术概念提出一个非常笼统的问题,我不知道它是否存在或是否可行

其思路如下:


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

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

这样的事情可能吗,我会说是的,尽管可能很复杂。由于某些虚拟机的体系结构,这可能是不可能的。在任何编程语言中都存在类似的东西吗?甚至在非垃圾收集语言中

注意:我不确定除了编程语言之外,应该在这个问题上添加什么标记,我也不确定是否有更好的地方来解决这个问题。所以请原谅我

编辑

也许这个概念可以与Linux或Hibernate上的一般概念相比较

  • 您必须收集对其他对象的所有引用。包括不重复的对象(循环)图。至少对于序列化线程来说,这需要某种“停止世界”。有效地完成这项工作很复杂,但可能是因为许多语言(java)中的本机序列化机制都在为开发人员完成这项工作
  • 在不同的硬件架构中,您需要某种VM来从字节顺序中提取
  • 您必须将对象从任何类型的环境中分离。您不能传递表示线程、文件句柄、套接字等的对象。您将如何检测它
  • 在当今的系统中,内存是虚拟的,所以不可能简单地将地址从一台机器复制到另一台机器上——你必须翻译它们
  • 对象不仅是开发人员可见的数据,而且是结构、沙箱信息、权限、超类、已加载的方法/类型以及由于优化和延迟加载而未加载的方法/类型、垃圾收集器元数据等
  • 对象/类的版本。在一台机器上,可以从版本1的源代码创建类A,但在另一台机器上,allready可能是从版本2的源代码构建的类A的对象
  • 考虑性能。它会比旧式连载更快吗?它有什么好处
  • 可能还有很多我们都没想到的事情

  • 所以:我从来没有听说过这样的解决方案。这在理论上似乎是可行的,但出于某种原因,从来没有人这样做过。每个人都提供简单的旧编程序列化。也许你会发现新的、更好的方法,但请记住,你将与人群背道而驰

    “对象本身可能包含多个对象,但不涉及任何其他对象。”这听起来像是自相矛盾。你能澄清一下你的意思吗?我的意思是不提及外部世界。对象的任何子元素都不会引用除对象的子元素或对象本身之外的任何内容。但这永远不会发生,根据定义,从对象引用的任何内容都是子元素。确定。假设A->B代表A引用B。如果我们有A->B和A->C,那么B和C就是我所说的对象A的子元素。那么我们可以有D->A,其中D不是A的子元素,这是允许的,但C->D会破坏条件。对不起,如果我不能用正确的语言表达,为什么会打破这个条件?为什么D不被认为是A的间接子元素,使用A→ C→ D或者你是说循环是不允许的?