gpt4 book ai didi

java - BlazeDS自定义序列化导致RangeError

转载 作者:行者123 更新时间:2023-12-02 08:23:42 25 4
gpt4 key购买 nike

我正在使用 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);
}
}
}

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

最佳答案

不确定这是问题的原因,因为我不了解 BlazeDS,但是 NullAbleID 的方法 readExternalwriteExternal类不是对称的:您在 writeExternal 中写入 Integer 类型的对象,并在 readExternal 中读取 int。

关于java - BlazeDS自定义序列化导致RangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4968457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com