2009-06-16 5 views
1

평범한 오래된 객체가 많은 경우, 여러 클래스에 매핑하는 가장 좋은 방법은 무엇입니까? 내가 다음 몇 가지 JSON을 끌어 역 직렬화하는 HTTPService를 사용하는 경우ActionScript 객체와 클래스 간의 매핑?

예를 들어, 내가 같이 개체의 무리가 있습니다 :

{ type: "person", 
    id: 42, 
    name: "David" } 

를 그리고 난의 인스턴스로를 설정하려면 a Person 클래스 :

class Person { 
    id:int; 
    name:String; 
} 

이렇게하는 표준적인 일반적인 방법이 있습니까?

는 (도 고려 될 : 어떻게 객체 사이의 관계를 다루는 몇 가지 표준 방법에 대한 예를 들어, 사람이 추가 "배우자"필드가 있다면?

{ type: "person", spouse: 61, ... } // Where 61 is the ID of the spouse 

)

감사합니다, David

+0

AMF를 사용하여 데이터를 수신하고 있습니까? – Josh

+0

아니요 ... AMF를 사용하면이 작업이 더 쉬울 수 있지만 다른 작업 (특히 서버 측 코드)은 훨씬 복잡해집니다. –

답변

3

표준 방법은 없지만 두 가지 방법으로 해결할 수 있습니다.

버전 1 : 생성자 방법

public class Person { 
public function Person(raw:Object=null) { 
    if (raw != null) { 
    for (var key:String in raw) { 
    try { 
    this[key] = raw[key]; 
    } catch (e:Error) {} 
    } 
    ... 

이는 경향이 오류의 일종이다. 이라는 키 속성이 없으면 할당이 실패하고 유형이 일치하지 않거나 자동으로 강제 변환 될 수없는 경우 실패하게됩니다.

버전 2 : flash.utils.describeType()

은 훨씬 더 정교하고 더 많은 제어 할 수 있습니다. 먼저 Person 인스턴스를 만들고 describeType()을 호출해야합니다.

var o:Object = { ... } // raw person data 
var p:Person = new Person(); 
var typeDesc:XML = flash.utils.describeType(p); 
for (var key:String in o) { 
var node:XML = typeDesc.variable.(@name==key)[0]; 
if (node != null) { 
    // Person class has a property *key* 
    p[key] = o[key]; 
} 
} 

하지만 공용 변수 대신 getters와 setter를 사용할 때주의하십시오. typeDesc.accessor를 사용하고 액세스 속성이 writeonly가 아닌지 확인해야 typeDesc.variable을 사용하여 액세스 할 수 없습니다.

유형 키 관련. 클래스의로드를 동적으로 수행 할 수 있습니다 :

var clazz:Class = flash.utils.getDefinitionByName(raw.type+""); 
var person:Person = Person(new clazz()); 

물론 raw.type는 사람 또는 com.package.Person를 포함 할 수 있습니다 한 대상 클래스가 존재하고 동적으로 프로젝트 또는 컴파일 된대로 SWC가로드되었습니다.

하여 살펴 보자

http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#getDefinitionByName()http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#describeType()

희망이 도움이 :)

+0

네, 그렇습니다 - 고마워요. –

1

깨끗하고 덜 오류가 발생하기 쉬운 물건을 유지하기 위해, 나는 이러한 작업을 모두 수행하기 위해 별도의 객체를 사용하십시오 ., 당신이 정말로 실제 Person 객체의 독립이 기능을 분리 할 수있는 별도의 객체로이 단계에 대한 모든 논리를 이동

public class PersonFactory 
{ 
    function buildFromGenerics(objects:Array):Array 
    { 
     var a:Array = []; 
     var l:int = objects.length; 

     for (var i:int = 0; i < l; i++) 
     { 
      var o:Object = objects[i]; 
      var p:Person = new Person(); 
      p.id = o['id']; 
      p.name = o['name']; 
      a[i] = p 
     } 

     return a; 
    } 
} 

예를 들어, 변환을 처리하기 위해 다음과 같은 개체가있을 수 있습니다 거기에 아무런 소유권도 없습니다.

두 번째 상황에 나는 모든 당신 사람 개체를 보유하고 있으며 여기에서 입증 된 바와 같이, 그 (것)들을 검색하기위한 인터페이스를 제공하는 별도의 개체를 사용하십시오 :

public class PersonCollection 
{ 
    private var _people:Array; 

    public function setPeople(people:Array):void 
    { 
     _people = people; 
    } 

    public function getPersonByID(id:int):Person 
    { 
     var l:int = _people.length; 

     for (var i:int = 0; i < l; i++) 
     { 
      var p:Person = _people[i]; 

      if (p.id == id) 
      { 
       return p; 
      } 
     } 

     return null; 
    } 
} 

이 분리는 코드를 깨끗하게 유지하는 데 도움을 또한 작업하고 관리하는 쉬운 방법을 제공합니다. 희망이 도움이됩니다.

+0

도움이됩니다 - 고마워요. –

관련 문제