2011-12-30 3 views
1

이것은 Javascript Serialization of Typed Objects의 후속 질문입니다. 이 솔루션은 유형이 알려진 객체에 대해서는 정상적으로 작동하지만 이제는 비 직렬화를 수행 할 코드에 의해 알 수없는 유형의 객체가 있습니다. 직렬화해야 할 여러 속성이있는 기본 클래스 "Sprite"가 있습니다. 임의의 수의 파생 클래스 ("Player"및 "Platform"등)는 Sprite 클래스에서 파생되고 자체 속성을 추가 할 수 있습니다. 또한 Sprite 파생 개체 컬렉션을 포함하는 "MapLayer"개체가 ​​있습니다. 비 직렬화가 완료되면 각 스프라이트가 올바른 파생 유형이되도록 레이어와 모든 스프라이트를 비 직렬화합니다. eval ("new"+ derivedTypeName + parameterList)을 사용해야합니까? 더 좋은 방법이 있습니까?알 수없는 파생 클래스의 JavaScript 객체를 비 직렬화하는 방법

자세한 내용 : Sprite 기본 클래스는 하드 코딩되었지만 파생 클래스는 모두 생성 된 코드입니다. 코드 생성기에서 모든 파생 클래스에 대해 deserialize 함수를 생성 할 수는 있지만 일반 기본 클래스 deserialization 함수에서 적절하게 호출하는 방법은 무엇입니까? MapLayer 클래스는 하나 뿐이며, 어떻게 든 Sprite에서 파생 된 모든 클래스에서 deserialize 함수를 호출해야합니다.

+0

이 내용을 본질적으로 끓여보십시오. 다른 질문을 참조하지만 그 질문과 일치하지 않는 시나리오를 설명합니다 (예 : deserialization에 사용되지 않는 'new'에 대해 묻고 있습니다). –

+0

@KenBrowning "new"가 제안 된 답변에 사용되었습니다 그 질문에. – BlueMonkMN

답변

2

파생 된 개체의 생성자 함수를 호출하려면 먼저 호출 할 생성자를 알아야합니다. 당신은 당신이 현재 직렬화 된 페이로드 유형의 정보를 인코딩하는 방법에 대한 자세한 내용을 제공, 그래서 당신이 뭔가를 가지고 말을하지 않는 다음

var MyDerivedType = function() {...}; 
MyDerivedType.prototype.__derivedTypeName = 'MyDerivedType'; 
MyDerivedType.deserialize = function (input) { 
    var obj = JSON.parse(input); 
    return new MyDerivedType(obj); 
}; 

당신이 파생 된 유형을 지정하지 않는 경우 글로벌 범위라면 deserialization 할 때 주소를 지정할 수 있어야합니다. 여기에 Sprite 생성자 자체를 저장하는 예이다 :

다음
Sprite.derivedTypes = Sprite.derivedTypes || {}; 
Sprite.derivedTypes['MyDerivedType'] = MyDerivedType; 

당신은 eval을 사용하지 마십시오과 같은 적절한 디시리얼라이저를 호출 할 수

Sprite.deserialize = function(input) { 

    // json parse the data string to pull out our derived type 
    var o = JSON.parse(input); 

    // delegate to the derived type's deserialize method 
    return Sprite.derivedTypes[o.__derivedTypeName].deserialize(input); 
}; 

자바 스크립트/브라우저에 내장 아무것도 없다 js 환경은 .net에 익숙한 의미에서 "클래스"에 비 직렬화를 제공합니다.

+0

그 이름으로 전역 네임 스페이스의 모든 구성원을 참조하는 유일한 방법입니까? window []? – BlueMonkMN

+0

글로벌 네임 스페이스에 대한 참조를 보유하는 새 변수를 만들 수 있습니다. 그러나 전역 네임 스페이스를 "오염시키는"것을 피하고 생성자 함수에 대한 참조를 다른 변수에 저장하는 것이 더 바람직합니다. –

+0

내 코드를 검토 한 결과, 내 개체가 실제로 전역 네임 스페이스에없는 것을 발견했습니다. 그러나 예를 들어 예측할 수없는 네임 스페이스에 존재하는 경우 알 수없는 개체가 자체를 deserialize하지 못하도록하는 일반적인 방법이없는 것 같습니다. .NET에서 이진 직렬화 또는 반사를 사용하여 유형의 정규화 된 이름을 검색하여 네임 스페이스에 관계없이 같은 유형의 객체를 재구성 할 수 있습니다. 임의의 "네임 스페이스"에있는 JavaScript 객체가 직렬화 가능 클래스에서 상속 받기로 결정하면 일반 직렬화에 대한 가능성은 없습니다. – BlueMonkMN

관련 문제