JavaScript/Google v8的持久性框架

Joh*_*hnB 2 javascript persistence v8 object-persistence

是否有任何类型的JavaScript和/或Google v8引擎的持久性框架?

我想存储(序列化)整个对象图(包括例如函数)并稍后重新加载它.JSON是不够的,因为它不允许存储函数并且只允许树状结构(即没有两个对象引用同一个对象).

我需要能够做到这一点(即在我编写程序嵌入v8的时候不知道JavaScript代码),因为我希望程序的用户能够使用JavaScript自定义它,但我需要存储我的程序状态(包括自定义状态)并稍后重新加载.因此,我需要存储JavaScript引擎的状态.

编辑:

例:

假设我们有以下代码:

var obj = { a: 4, b: function (x) { return x + this.a; } }
// ...
if ( ... ) { obj.a = 5; }
// ...
if ( ... ) { var c = 1; obj.b = function (x) { return x + this.a + c; } }
// ...
// now I want to serialize obj
Run Code Online (Sandbox Code Playgroud)

那么它(没有关于程序逻辑的任何元信息)是否可以序列化obj并随后反序列化,以便obj.b (2)在反序列化之后提供与序列化之前相同的结果?

第二次编辑:注意关闭.

sam*_*aml 6

不幸的是,Javascript目前无法实现您的目标.原因是闭包不仅仅是对象,它们是绑定到执行上下文的对象.

越过"这不能在javascript中完成"问题并进入"如果为V8编写补丁以允许这个"阶段的答案,这在概念上是困难的.从本质上讲,对于你要序列化的每个闭包,你必须序列化Context闭包所在的对象.能够序列化它是很好的HandleScope,但闭包的本质是你无法进入它们内部.

好吧,那么让我们说你已经编写了一个函数,它可以序列化闭包所在的Context,你甚至可以反序列化它.你用它做什么?

答案是"不多".Javascript一次只能在一个上下文中执行.您已反序列化的闭包在您尝试将其拉回的上下文中不存在.你不能真正在上下文之间传递数据,如果你的函数有绑定到自由变量的数据,你是否使用反序列化器调用上下文中存在的数据,或者你用反序列化的上下文覆盖它?从概念上讲,这是一场噩梦.

Ecmascript Harmony考虑过给我们几乎一流的延续,但它已被推到我在这里讨论的讨论,但这不会很快发生.