2011-10-31 4 views
5

내 게임에서는 모든 개체를 JSON으로 변환 한 다음 파일에 저장하여 현재 상태를 저장합니다. 적과 같은 일부 객체는 함수가 있지만 JSON은 함수를 저장할 수 없습니다! 대안이나 해결책이 있습니까?어떻게 JSON이 객체의 기능을 저장할 수 없습니까?

+4

json이 _data_를 비 직렬화하기 때문입니다. – Raynos

+0

함수 인스턴스가 특정 또는 "클래스"에 특정한가요? – Thor84no

+0

함수의 범위를 serialize하고 deserialize 할 때 어떤 일이 발생합니까? 함수는 문자열 표현의 코드 그 이상입니다. – pimvdb

답변

7
var Enemy = { 
    toJSON: function() { 
    // pack it up 
    }, 
    fromJSON: function (json) { 
    // unpack it. 
    }, 
    /* methods */ 
}; 

var e = Object.create(Enemy); 
var json = JSON.stringify(e); 
var same_e = Enemy.fromJSON(json); 

.toJSON 방법은이 방법을보고 존재하는 경우,이 반환 된 객체를 캐릭터 라인 화됩니다 호출됩니다 JSON.stringify의 표준 인터페이스입니다.

.fromJSON 메서드는 Enemy 개체의 명명 된 생성자에 불과합니다.

구체적인 예를JSfiddle

var Enemy = { 
    constructor: function(name, health) { 
    this.health = health || 100; 
    this.name = name; 
    }, 
    shootThing: function (thing) { }, 
    move: function (x,y) { }, 
    hideBehindCover: function() {}, 
    toJSON: function() { 
    return { 
     name: this.name, 
     health: this.health 
    }; 
    }, 
    fromJSON: function (json) { 
    var data = JSON.parse(json); 
    var e = Object.create(Enemy); 
    e.health = data.health; 
    e.name = data.name; 
    return e; 
    } 
} 

var e = Object.create(Enemy); 
e.constructor("bob"); 
var json = JSON.stringify(e); 
var e2 = Enemy.fromJSON(json); 
console.log(e.name === e2.name); 

메타 옵션 :

는 메타 옵션을 사용하면로드 할 때

Game.Enemy = { 
    ... 
    class: "Enemy" 
}; 

그런 다음 객체 클래스 이름을 작성하는 것 모든 json 데이터는 방금

var instance = Game[json.class].fromJSON(json);

+0

기본적으로 게임이 시작될 때마다 새로운 적의 인스턴스를 만들어야합니까? 오, 조금 더 많은 일이 있지만 문제는 없습니다. ... – corazza

+0

@bane 새 인스턴스는 값이 쌉니다. 원하는 경우 메타 정보를 입력 할 수 있습니다. – Raynos

+0

@Raynos 적 개체가 개체 트리 깊숙이있는 경우에는 작동하지 않습니다. – thejh

1

난 당신이 기능은 시간을 구문 분석에 다시 추가 할 수 있도록 개체의 유형을 저장할 필요가 있다고 생각합니다. 예 : 적에 type 속성을 생성자에 넣습니다. 구문 분석시에는 먼저 JSON과 같은 문자열을 구문 분석 한 다음 결과 객체를 심도있게 탐색합니다. Enemy과 같은 것을 발견하면 방법 등을 다시 첨부하십시오.

관련 문제