2014-04-08 15 views
2

Flex 웹 애플리케이션은 RemoteObject 연결을 사용하여 PHP에 맞춤 클래스 객체를 전송합니다. 이 객체에는 여러 깊이 수준이 있으며 기본 깊이 내에 중첩 된 객체가 있습니다. 개체가 아무리 복잡해도 관계없이 허용되는 중첩 수준의 수에 제한이 있습니다. 도착했을 때,이 오류와 함께 데이터 충돌을 보내기 전에 RemoteObject에 의해 직렬화 :RemoteObject와 함께 전송 된 객체에서 중첩 된 레벨 도달

형식 오류 : 오류 # 1034 : 유형 강제 변환에 실패했습니다 mx.messaging.messages.IMessage 도중 7e30f89 @ 객체를 변환 할 수 없습니다.

가벼운 물체를 보내면 (모든 속성을 제거하면) 동일한 현상이 발생합니다. 개체가 적은 수준이

var params:Object = {}; 
params['test'] = {0:{1:{2:{3:{4:{5:{6:{7:{8:{9:{10:{11:{12:{13:{14:{15:{16:{17:{18:{19:{20:{21:{22:{}}}}}}}}}}}}}}}}}}}}}}}}; 
remoteObject.runService(params); 

경우, 작동 : 예에서

params['test'] = {0:{1:{2:{3:{4:{5:{6:{7:{8:{9:{10:{11:{12:{13:{14:{15:{16:{17:{18:{19:{20:{21:{}}}}}}}}}}}}}}}}}}}}}}}; 

무엇 보이는 것은은 RemoteObject에 어쩌면, 그 후 (23) (24)의 최대 중첩 수준의 깊이를 수 있다는 것입니다 충돌. JSON에서 보내기는 옵션이 아니므로 기본 객체 내부의 모든 입력 된 클래스와 객체가 손실됩니다.

아무에게도이 문제를 어떻게 해결할 생각이 있습니까? 사전에

감사합니다!

+0

개체 그래프 중첩 수준은 24 개입니까? 영주님. 일반적으로 객체를 웹 응용 프로그램에 보내기 전에 객체를 평평하게하려고합니다. 백엔드 변경을 고려할 때 데이터 구조를보다 쉽게 ​​액세스 할 수 있고 취약하지 않습니다. –

+0

FLEX 응용 프로그램을 사용하면 사용자가 여러 노드와 속성을 추가하여 네트워크를 설계 할 수 있습니다. 각 노드에는 여러 자식 노드가 있습니다. 사용자가 설계를 완료 할 때까지 깊이를 알 수 없습니다. 오류가 발생했습니다 : "개체가 더 반복적으로 반복 될 수 없습니다. 아마도 루프 된 참조" AMFPHP 버전을 2.1에서 2.2로 업그레이드하여이 작업을 관리했습니다. 이전 플러그인 인 "AmfphpCustomClassConverter"가이 문제를 일으킨 것 같습니다. 그것은 이제 "AmfphpVoConverter"로 이름이 바뀌었고, 송신 된 오브젝트에 얼마나 많은 레벨을 설정했는지에 관계없이 이제는 정상적으로 작동합니다. – spacorum

+0

아, 그건 의미가 있습니다. 자녀/부모 관계가있는 것이 있다면 네트워크 다이어그램이 될 것입니다. 솔루션을 발견하고 여기에 게시 해 주셔서 감사합니다. 드물지만 관련이 많은 문제인 것처럼 보입니다. –

답변

0

트리를 더 관리하기 쉬운 덩어리로 나누지 않고 트리 구조에서 24 레벨을 유지하는 것은 매우 지속 가능한 아이디어는 아닙니다. 트리를 평면 구조로 변환하려면 트리의 각 노드에 UID, 자식 배열 및 필요한 경우 부모에 대한 참조를 제공해야합니다.

평평한 트리를 서버로 보내면 서버에 보내는 각 노드가 해당 UID와 자식 및 부모의 UID를 포함하는 형식화되지 않은 개체가되도록 개체를 직렬화합니다. 이것은 완전히 평평한 구조이며 중첩 할 필요가 없습니다. 서버에서 읽을 때 클라이언트에서 트리 구조를 재구성합니다.

public class Node { 
    public var uid:String; 
    public var children:Array = []; 
    public var parent:String; 

    public function addChild(node:Node):void 
     children.push(node); 
     node.parent = this; 
    } 
}   

// Elsewhere.. 

// Convert tree nodes into flat array of raw objects 
public function serialize(rootNode:Node):Array { 
    // Remove tree structure. 
    var flattenedNodes:Array = flatten(rootNode); 

    // Convert to untyped objects using only string UIDs to identify children and parents. 
    var untypedNodes:Array = []; 
    for each (var node:Node in flattenedNodes) { 
     var childIds:Array = []; 
     for each (var child:Node in node.children) { 
      childIds.push(child.uid); 
     } 

     var untypedNode:Object = { 
      uid: node.uid, 
      parent: node.parent ? node.parent.uid : null, 
      children: childIds 
     }; 
     untypedNodes.push(untypedNode); 
    } 

    return untypedNodes; 
} 

private function flatten(node:Node):Array { 
    var result:Array = [node]; 
    for each (var child:Node in node.children) { 
     result = result.concat(flatten(child)); 
    } 
    return result; 
} 

// Convert a flat array of raw objects back into tree nodes 
public function deserialize(items:Array):Node { 
    var root:Node; 
    var current:Node; 
    var item:Object; 
    var uidToNodeMap:Dictionary = new Dictionary(); 
    // Add all nodes to a map by uid 
    for each (item in items) { 
     current = new Node(); 
     current.uid = item.uid; 
     uidToNodeMap[item.uid] = current; 
     if (!item.parent) { 
      root = current; 
     } 
    } 
    // Build tree by replacing ids with actual nodes 
    for each (item in items) { 
     current = uidToNodeMap[item.uid]; 
     current.parent = uidToNodeMap[item.parent]; 
     for each (var childId:String in item.children) { 
      current.children.push(uidToNodeMap[childId]); 
     } 
    } 
}