2011-02-11 2 views
0

Java와 Flash/Flex간에 통신하는 데 BlazeDS를 사용하고 있습니다. 그리고 Java Null Integer가 Flex 측에서 0이된다는 점을 제외하면 모든 것이 잘 작동합니다.BlazeDS 사용자 정의 직렬화로 인해 RangeError가 발생합니다.

Java Null Integer를 Flash/Flex int로 옮기는 문제를 해결하기 위해 Java 측에서 작동하고 음수 값을 사용하여 Null 값을 표현하는 사용자 지정 직렬화를 구현했습니다.

내가 자바 결과를 역 직렬화하는 동안 예외가 플렉스 측에 occures

RangeError: Error #2006: Der angegebene Index liegt außerhalb des zulässigen Bereichs. 
(in english: the index is out of range) 
       at ObjectInput/readObject() 
       at mx.collections::ArrayList/readExternal()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ArrayList.as:586] 
       at mx.collections::ArrayCollection/readExternal()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ArrayCollection.as:147] 
       at ObjectInput/readObject() 
       at mx.messaging.messages::AbstractMessage/readExternal()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\messages\AbstractMessage.as:486] 
       at mx.messaging.messages::AsyncMessage/readExternal()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\messages\AsyncMessage.as:170] 
       at mx.messaging.messages::AcknowledgeMessage/readExternal()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\messages\AcknowledgeMessage.as:95] 

를 얻을 구현 후. 사용자 지정 직렬화에서이 특수 클래스를 포함하는 복잡한 개체 목록입니다. 사용자 지정 serialization을 추가하기 전까지는 그런 문제가 없었기 때문에 문제에 속해야한다고 생각하지만 예외를 유발하는 단서가 없습니다. 읽기와

/** 
* Generated by Gas3 v2.1.0 (Granite Data Services). 
* 
*/ 
package crux.domain.dto { 

    import flash.utils.IExternalizable; 

    [Bindable] 
    public class NullAbleIDBase { 

     public function NullAbleIDBase() {} 


     private var _id:Number; 

     public function set id(value:Number):void { 
      _id = value; 
     } 
     public function get id():Number { 
      return _id; 
     } 
    } 
} 

플렉스 서브 클래스 : 우리가 Gas3 화강암 데이터 서비스 코드 생성을 사용하기 때문에, 두 개의 클래스 :

package crux.domain.dto; 

import java.io.Externalizable; 
import java.io.IOException; 
import java.io.ObjectInput; 
import java.io.ObjectOutput; 
import java.io.Serializable; 

public class NullAbleID implements Serializable, Externalizable { 

    private static final long serialVersionUID = 788620879056753289L; 

    private Integer id; 

    public NullAbleID() { 
     super(); 
     this.id = null; 
    } 

    public NullAbleID(final Integer id) { 
     this.id = id; 
    } 

    getter, setter for ID and hashCode and equals 

    @Override 
    public void writeExternal(ObjectOutput out) throws IOException {   
     out.writeObject(this.nullToNegative(this.id));     
    } 

    @Override 
    public void readExternal(ObjectInput in) throws IOException { 
     this.id = this.negativeToNull(in.readInt()); 
    } 

    private int nullToNegative(Integer id) { 
     if (id == null) { 
      return -1; 
     } else {   
      return id.intValue(); 
     } 
    } 

    private Integer negativeToNull(int flashId) { 
     if (flashId < 0) { 
      return null; 
     } else { 
      return Integer.valueOf(flashId); 
     } 
    } 
} 

플렉스 :

은 사용자 정의 직렬화와 객체의 코드 외부 쓰기 가능

package crux.domain.dto { 

     import flash.utils.IDataInput; 
     import flash.utils.IDataOutput; 
     import flash.utils.IExternalizable; 

    [Bindable] 
    [RemoteClass(alias="crux.domain.dto.NullAbleID")] 
    public class NullAbleID extends NullAbleIDBase implements IExternalizable{ 

      public function readExternal(input:IDataInput):void { 
        id = input.readInt(); 
      } 

      public function writeExternal(output:IDataOutput):void { 
        output.writeInt(id); 
      } 
    } 
} 

이 문제는 몇 시간을 소비하지만, 아이디어가 뭔지. 예외의 원인을 확인하십니까? 당신이 writeExternal에서 정수 유형의 객체를 작성하고, 당신은 읽기 : 내가 블레이즈 DS를 모르기 때문에이 문제의 원인,하지만 방법 readExternalNullAbleID 클래스의 writeExternal이 symetric하지

답변

2

확실하지 않음 int in readExternal.

+1

대단히 감사합니다. 내 하루와 주말을 절약 한 덕분에 두 표를 얻고 싶습니다. (어쨌든 이것은 불가능합니다.) - 어쨌든 :이 질문을 읽는 모든 기관은 문제가 있습니다. writeObject' 자바 쪽 쓰기 외부 메서드는'out.writeInt'이어야합니다. – Ralph

관련 문제