2011-02-11 61 views
0

我正在使用BlazeDS在Java和Flash/Flex之间进行通信。并且一切正常,除了Java空整数在Flex端变为0。BlazeDS自定义序列化导致RangeError

要处理将Java空整数传输到Flash/Flex int的问题,我实现了一个自定义序列化,它在Java端工作,并使用负值来表示Null值。

实现,我得到一个

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] 

异常在Flex端occures反序列化的Java结果之后。 这是一个复杂对象的列表,其中包含此特殊类的自定义序列化。因为在添加自定义序列化之前没有这样的问题,所以我猜它必须属于这个问题,但我不知道触发异常的原因。

这是该对象与自定义序列化代码:

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); 
     } 
    } 
} 

软硬度:两班,因为我们使用Gas3的花岗岩数据服务的代码生成:

/** 
* 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; 
     } 
    } 
} 

Flex的子类读并写入外部

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); 
      } 
    } 
} 

我在这个问题上花了几个小时,但我没有想法是什么问题。 你是否看到异常的原因?

回答

2

不知道它的问题的原因,因为我不知道BlazeDS的,但是这些方法readExternal和你NullAbleIDwriteExternal不是对称的:你写整数类型的对象writeExternal,你读的int在readExternal

+1

非常感谢,我想给你两张票,因为你节省了我的一天和一个周末(这是不可能的,这是多么可惜) - 无论如何:读这个问题的每个人都是这个问题。 write方法必须是`out.writeInt` – Ralph 2011-02-11 12:24:44