2009-09-26 4 views
3

웹 서비스를 통해 연결된 Flex 프론트 엔드와 C# 백엔드를 사용하여 응용 프로그램을 개발하고 있습니다. 우리는 FLex Builder 3의 웹 서비스 관리자를 사용하여 웹 서비스 클래스를 자동 생성합니다. Flex가 객체를 직렬화 할 때 문제가 발생합니다. 예를 들어 값이없는 Number 속성이 있고이 객체가 NaN으로 직렬화되고 백엔드가 NaN을 모르는 경우입니다. 또 다른 예는 순환 참조를 직렬화 할 때 스택 오버 플로우 예외가 발생하는 경우입니다. 자바에서 예를 들어 순환 참조로 xstream이 작동하는 방식을 구성 할 수 있습니다 ... 그렇다면 문제는 C#이 프론트 엔드에서 작동하도록 객체를 직렬화하는 방식을 변경할 수 있습니까? flex가 객체를 직렬화하는 방법에 대해 알아야 할 문제가 있습니까? 감사합니다. 호르헤C# 백엔드에서 flex에있는 객체를 직렬화하는 방법

답변

0

Flex Bluider의 웹 서비스 관리자를 사용하면 작성한 모든 웹 서비스에 대해 프록시 ActionScript 클래스가 자동으로 생성됩니다. 직렬화 프로세스는 웹 서비스 중 하나를 실행할 때 이러한 클래스를 사용합니다. 이러한 클래스의 속성을 편집하여 C# 측에서 항상 처리 할 수 ​​있습니다 (이 방법을 사용하면 NaN 값을 제거 할 수 있습니다).

내가보기에 또 다른 옵션은 객체를 XML과주고받는 사용자 정의 코드를 작성하는 것입니다. This Adobe article으로 시작할 수 있습니다. 난 그냥 볼 나는이를 사용한 적이 있지만, 당신은 아마 (찾고 무엇

:

0

나는 자동 생성 된 클래스의 직렬화를 변경하지만 다음과 같은 몇 가지 도움을 제공하려고합니다 방법을 잘 모르겠습니다 내가했던

것들 :

    그것은 모든 시간을) 언급

    • 안부에서 액션 스크립트 플러그인

    에 사용 Protocol Buffers 문제로 직면 : as3corelib

내가 한 번도 안 써봤 또 다른 아이디어를 쉽게 수행 할 수 있습니다

  • 사용 JSON :

    • 나는 수많은 issu 객체를 Java로 직렬화하기 때문에 철저히 테스트하십시오.
    • 직렬 생성 문제가있는 .Net과 함께 자동 생성 웹 서비스를 사용해 보았습니다. SDK를 업데이트 할 때 자동 생성이 상당히 바뀌는 것 같지만 서비스가 전혀 없으며 근본 원인을 찾지 못했습니다.
  • 1

    조금 다른 디자인을 고려해야한다고 생각합니다. 비슷한 문제가 있었지만 다음 해결책을 개발했습니다.

    만 원시 인수

    웹 서비스 메소드의 인수 (문자열, INT) 등 만 기본 유형을 정의합니다 ..

    당신은 클래스가 예를 들어

    ,

    class Person{ 
        long PersonID; 
        long MembershipID; 
        string Name; 
    } 
    

    그리고 당신은 백엔드에 "이름"속성을 변경하려면, 진실은 쉽게 당신은, 당신이 그 프론트 엔드를 처리해야합니다 귀하의 프론트 엔드를 신뢰하지 않아야 할 수있다 이 경우 MembershipID처럼 프론트 엔드가 수정할 수없는 필드 인 것처럼 잘못된 데이터를 보낼 수 있습니다.

    사람이 올바르게 저장하는 코드를 작성할 수 있지만 누군가가 쉽게 WSDL을 읽고 코드를 손상시킬 수 있습니다.

    이렇게 대신.

    [WebMethod] 
    public void SavePerson(Person p){ 
        p.Save(); <-- this is dangerous 
    } 
    

    우리는 그러나 또한 전문 래퍼 클래스를 사용하여 방지 할 수 있습니다 왕복,

    [WebMethod] 
    public void SavePersonName(long personID, string name){ 
        Person p = GetPersonByID(personID); 
        p.Name = name; 
        p.Save(); 
    } 
    

    내가 많은이 더 서버에 더 왕복뿐만 아니라 코딩이 발생할 것이라고 주장 알고 사용합니다. 인수

    // I will only define the fields I want to pass to server 
    // this needs to be done at backend level 
    class PersonAddressWrapper{ 
        long PersonAddressID; 
        string AddressLine1; 
        string AddressLine2; 
        string ZipCode; 
        string City; 
        string Country; 
    } 
    
    class PersonWrapper{ 
        long PersonID; 
        string Name; 
        PersonAddressWrapper[] Addresses; 
    } 
    
    [WebMethod] 
    public void SavePerson(PersonWrapper pw){ 
        Person p = GetPersonByID(pw.PersonID); 
        p.Name = pw.Name; 
        p.Save(); 
        foreach(PersonAddressWrapper paw in pw.Addresses){ 
         PersonAddress pa = GetPersonAddressByID(paw.PersonAddressID); 
         Copy(pa,paw); 
         pa.Save(); 
        } 
    } 
    

    당신이, 당신은 또한 포함하는 래퍼 클래스를 구성 할 수 있습니다 라운드 트립을 줄일 수 있습니다이 방법에 래퍼 클래스의

    사용/너무 당신의 순환 의존성과 그 안전을 제거 할 수있는 항목을 제외 할 수 있습니다.

    예 더 많은 작업이 필요하다는 것을 알고 있지만 이것은 안전한 방법입니다.

    0

    귀하의 문제에 대한 결정을 내렸을 수 있습니다.

    FlexBuilder3에서 자동 생성 클래스를 사용하는 경우 보내는 비누 메시지를 잡아서 수정할 수 있습니다. "Base [ServiceName]"클래스의 "call()"함수에서 쉽게 수행 할 수 있습니다.

    당신이해야 할 일을 모두 내가 (아래 참조) cleanXML 기능을 한 내 경우 문자열

    message.body = soap.toString(); 
    

    전에 "비누"변수를 수정하는 것입니다. 이 기능은 속성 XSI가에 "NaN의"동일 또는 모든 XML 요소 삭제 : 무기 호 = '진정한'

    private function cleanXML(xml:XML, qn:QName):void{ 
        if (XMLList(xml).hasSimpleContent()){ 
         if ((xml.valueOf() == "NaN") || (xml.attribute(qn) == true)){ 
          delete xml.parent().children()[xml.childIndex()]; 
         } 
        }else{  
         for each (var item:XML in xml.children()){ 
          cleanXML(item, qn); 
         } 
        } 
    } 
    

    그래서() 함수 호출의 언급 부분은 다음과 같습니다

    var soapList:XML; 
        soapList = soap as XML; 
    
        var qn:QName = new QName(soapList.namespace("xsi"), "nil"); 
        cleanXML(soapList, qn);   
    
        message.body = soapList.toString(); 
    

    나는이 결정이 좋지 않다는 것을 안다. 내 상황에서는 완벽하게 작동한다.

    관련 문제