2

是否有任何类型的 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

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

第二次编辑:注意关闭。

4

3 回答 3

6

不幸的是,您现在尝试做的事情在 Javascript 中是不可能的。原因是闭包不仅仅是对象,它们是绑定到执行上下文的对象。

超越“这不能在 javascript 中完成”问题并进入答案的“如果为 V8 编写一个补丁以允许这个”阶段,这在概念上是困难的。本质上,对于您要序列化的每个闭包,您都必须序列化Context该闭包所在的对象。能够仅序列化 就好了HandleScope,但闭包的本质是您无法进入它们内部.

好的,假设您编写了一个函数,可以序列化存在闭包的 Context,甚至可以反序列化它。你用它做什么?

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

Ecmascript Harmony 曾考虑为我们提供近乎一流的延续,但它已从我在这里咆哮的讨论中推开,但这不会很快发生。

于 2012-09-27T17:28:33.543 回答
0

我不认为持久化函数是一个好习惯。我可以建议你下面的方法。将您的 JSON 数据转换为诸如“MyData”之类的类。你可以从 JSON 中找到两个函数,toJSON 可以实现你想要的魔法。

var MyData = function(props){

    this.temp = "a";

    this.getTemp = function(){
        return this.temp;
    }

    this.fromJSON = function(props){
        if(props){
            this.temp = props.temp;
        }

    }
    this.toJSON = function(){
        var props = {};
        props.temp = this.temp;
        return props;
    }

    this.fromJSON(props);

}

var obj = new MyData({"temp" : "b"});
var state = obj.toJSON();
// persist state about the object as JSON string
LOCALSTORAGE.put(state); // You can write some HTML5 local storage stuff to persist

var persistedState = LOCALSTORAGE.get(); // You can use the above HTML5 local storage stuff to read the persisted stuff
var newBornObj = new MyData(persistedState);
于 2012-10-02T10:07:18.997 回答
0

HTML5 本地存储允许通过 javascript 在客户端级别进行持久性。

我不确定它是否符合您的需求,至于能够存储一个功能,您需要在某种程度上给它一些标记,以便您在从存储中检索它时反序列化它(或者可能只是将它存储为纯文本并尝试在检索时对其进行评估)

http://diveintohtml5.info/storage.html

于 2012-09-25T07:31:26.840 回答