【问题标题】:BlazeDS custom serialization causes RangeErrorBlazeDS 自定义序列化导致 RangeError
【发布时间】:2011-02-11 11:27:53
【问题描述】:

我正在使用 BlazeDS 在 Java 和 Flash/Flex 之间进行通信。一切正常,除了 Java Null Integer 在 Flex 端变为 0。

为了处理将 Java Null Integer 传输到 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]

反序列化 Java 结果时,Flex 端发生异常。 这是一个复杂对象的列表,其中包含具有自定义序列化的特殊类。因为在我添加自定义序列化之前没有这样的问题,我想它一定属于问题,但我不知道是什么触发了异常。

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

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

Flex:两个类,因为我们使用 Gas3 Granite Data Service 代码生成:

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

我在这个问题上花了几个小时,但我不知道问题是什么。 您看到异常的原因了吗?

【问题讨论】:

    标签: java flash blazeds amf


    【解决方案1】:

    不确定这是问题的原因,因为我不知道 BlazeDS,但是您的 NullAbleID 类的方法 readExternalwriteExternal 不是对称的:您在 @987654324 中编写了一个 Integer 类型的对象@,然后您在 readExternal 中读取了一个 int。

    【讨论】:

    • 非常感谢 mutch,我想给你两个投票,因为你拯救了我的一天和周末(可惜这是不可能的) - 无论如何:每个阅读这个问题的人,问题是不是java端写外部方法中的out.writeObject必须是out.writeInt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多