2012-08-06 3 views
0

솔직히 말해서이 질문으로 어디서부터 시작해야할지 모르겠습니다. 상황을 설명하겠습니다. HTML5 게임의 수준 편집기를 만드는 중입니다. 수준 편집기는 이미 작동합니다. 이제이 편집기로 만든 수준을 저장 /로드하고 싶습니다.Javascript : 효율적/올바르게 un-jsonify하는 방법

이 모든 것이 자바 스크립트 (레벨 편집기뿐만 아니라 게임)에서 수행 되었기 때문에 저의 레벨을 JSON과로드로 간단히 변환하는 것이 좋습니다. un-jsonify.

문제는 레벨에 여러 유형의 개체 (여러 가지 유형의 개체, 여러 유형의 애니메이션 개체 등)가 포함되어 있습니다. 지금 당장 게임에 개체를 추가하려고 할 때마다 해당 객체에 대해 특별히 unjsonify 메소드를 작성한 다음 레벨 객체의 unjsonify 메소드를 수정하여 새로 정의 된 객체 유형을 unjsonifying 처리 할 수 ​​있도록하십시오.

단순히 JSON.parse를 사용할 수 없습니다. JSON.parse는 원본과 동일한 키와 값을 가진 객체를 반환하기 때문에 실제로는 해당 클래스/프로토 타입의 객체가 아니기 때문에 JSON.parse를 사용할 수 없습니다. 내 질문은 그렇다면 게임에 새로운 유형의 객체를 추가 할 때마다 코드를 지속적으로 수정하지 않아도되는 올바른 방법이 있습니까?

답변

0

각 개체에 serialise/deserialise 메서드를 만들어서 상태를 JSON 개체에 넣고 개체에서 복구 할 수 있습니다. 복합 객체는 반복적으로 자식을 직렬화/역 직렬화합니다. 예를 들면 다음과 같습니다.

function Player { 
    this.weapon = new Weapon(); 
} 

Player.prototype.serialise = function() { 
    return {'type': 'Player', weapon: this.weapon.serialise()}; 
} 

Player.deserialise = function(json_object) { 
    var player = new Player(); 
    player.weapon = Weapon.deserialise(json.weapon); 
    return player; 
} 

분명히 실제 코드에서는 기대하는 유형의 객체를 얻고 있는지 확인해야합니다. 배열과 단순 해시 객체는 순차적/비 직렬화 중에 복사 될 수 있지만 자식은 종종 반복적으로 다시 호출해야합니다.

+0

감사합니다. 이것은 나를 위해 일했다. 그래도 궁금해서 ... 이걸 어느 정도 자동화하는 방법을 생각해 볼 수 있니? 예를 들어, 생성자 함수에 유형을 매핑 한 다음지도를 사용하는 일반 serialize/deserialize 함수를 사용할 수 있습니다 (각 객체에 대해 별도의 serialize/deserialize를 작성하지 않아도됩니까?) – tborenst

+0

@Xaan 그렇습니다. 일부 유형의 객체에 대한 자동 직렬화 메소드. 객체 속성을 반복 할 수 있고 hasOwnProperty를 사용하여 어떤 객체를 저장해야 하는지를 결정할 수 있지만 순환 참조 나 다른 문제를 처리해야하기 때문에 적용 할 수있는 위치를 생각해야합니다. 간단한 개체의 경우에는 괜찮을 것입니다. – andrewmu