2012-09-23 3 views
1

JavaScript 및/또는 Google v8 엔진에 대한 지속성 프레임 워크는 무엇입니까?JavaScript/Google v8의 지속성 프레임 워크

개체 (예 : 함수 포함)의 전체 그래프를 저장 (직렬화)하고 나중에 다시로드하려고합니다. JSON은 함수 저장을 허용하지 않고 트리 같은 구조 만 허용합니다 (즉, 동일한 객체를 참조하는 두 객체가 없음).

내 프로그램의 사용자가 자바 스크립트로 사용자 정의 할 수 있기를 원하기 때문에 일반적으로 (즉, 내 프로그램에 v8을 삽입하는 자바 스크립트 코드를 알지 못해서) 그렇게 할 수 있어야합니다. 하지만 내 프로그램의 상태 (사용자 정의 상태 포함)를 저장하고 나중에 다시로드해야합니다. 따라서 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)이 동일한 결과를 제공하도록 직렬화를 해제 하시겠습니까?

두 번째 편집 : 클로저에 유의하십시오.

+0

왜 기능을 유지해야하는지 이해할 수 없습니까? 객체 원형 상속으로부터 함수 (가정)를 복원 할 수 있기 때문에. –

+0

귀하의 질문에 완전히 명확하지 않습니다. 그럼에도 불구하고 나는 예제를 통해 나의 질문을 설명하려고 노력할 것이다. – JohnB

+0

왜 모든 자바 스크립트 코드를 저장하고 eval로 복원해야합니까? (서버에서 돌아 오는 것처럼)? 또는'toString()'을 사용하여 각 함수를 역 직렬화하십시오. 다시 eval은 피할 수 없습니다. –

답변

0

HTML5 로컬 저장소는 자바 스크립트를 통해 클라이언트 수준에서 지속성을 허용합니다.

기능을 저장할 수 있는지에 관해서는 잘 모르겠다. 저장소에서 검색 할 때 역 직렬화 할 수있는 마크 업을 다소 필요로한다. 그것은

http://diveintohtml5.info/storage.html

+0

흠, 함수를 일반 텍스트로 저장하는 문제는 함수에 클로저가 포함 된 경우 캡처 된 변수가 손실된다는 것입니다. – JohnB

+0

클로저 내부에서 얻은 값을 함수 범위의 변수에 복제해야합니다. 아주 끔찍하지만 트릭을 할 수 있다고 생각합니다. – Bardo

+0

이 제안의 가장 큰 문제점은 w3schools와 연결된다는 것입니다. W3Schools는 어떤 종류의 정보도 신뢰할 수있는 출처가 아닙니다. – saml

6

불행하게도, 당신이 할하려는 것은 자바 스크립트에서하실 수 없습니다) 검색에 그것을 평가 후면 시도하고 일반 텍스트로. 그 이유는 클로저가 객체가 아니라 실행 컨텍스트에 바인딩 된 객체이기 때문입니다.

"자바 스크립트에서이 작업을 수행 할 수 없습니다."라는 문제를 지나서 "이 작업을 수행하려면 V8 용 패치를 작성한 경우 어떻게합니까?"단계로 넘어 가면 개념적으로 어렵습니다. 본질적으로 직렬화 할 모든 클로저에 대해 클로저가있는 Context 개체를 직렬화해야합니다. HandleScope을 직렬화 할 수 있으면 좋겠지 만 클로저의 성격은 연결할 수 없다는 것입니다 그들 안에.

자, 클로저가 존재하는 컨텍스트를 직렬화 할 수있는 함수를 작성했다고 가정 해 봅시다. 그리고 그것을 역 직렬화 할 수도 있습니다. 너는 그걸로 무엇을합니까?

그 대답은별로 없습니다. Javascript는 한 번에 하나의 컨텍스트에서만 실행될 수 있습니다. 당신이 역 직렬화 한 폐쇄는 당신이 그것을 다시 끌어들이려는 맥락에서 존재하지 않는다. 컨텍스트간에 데이터를 실제로 전달할 수는 없으며 함수에 자유 변수에 바인딩 된 데이터가있는 경우 디시리얼라이저 호출 컨텍스트에있는 데이터를 사용합니까, 아니면이를 비 직렬화 된 컨텍스트로 덮어 씁니까? 개념적으로, 이것은 악몽입니다.

Ecmascript 하모니는 우리에게 거의 일류의 연속을 주겠다고 생각했지만, 내가 here에 대해 말한 토론에서 밀려 났지만, 이것은 곧 발생하지는 않습니다.

+0

이 통찰력있는 답변에 감사드립니다. 그러나 내가하려고하는 것은 Jurassic (C# JavaScript 엔진)에서 가능하기 때문에 Google v8에서 유사한 기능을 수행하는 것이 불가능하지 않아야합니다. – JohnB

+0

쥬라기에서 어떻게합니까? 나는 그것을 사용한 적이 없지만 그것이 어떻게 작동 하는지를 알기 위해 매료 될 것입니다. 구조적으로, 나는 V8과 다르다고 추측하고있다. – saml

+0

현상금을받은 답을 수락하지 않는 이유는 무엇입니까? – saml

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); 
+0

JSON이 아니라 클로저를 유지하는 방법을 묻는 것 같은데요. 클로저는 JSON 가능하지 않습니다. – saml