BlazeDS自定义序列化会导致RangeError [英] BlazeDS custom serialization causes RangeError

查看:279
本文介绍了BlazeDS自定义序列化会导致RangeError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用BlazeDS在Java和Flash / Flex之间进行通信。一切正常,除了Java的空整数变成了0在Flex端。

为了解决Java空整数转换为Flash / Flex int的问题,我有实现一个自定义的序列化,它在Java端工作,并使用负值来表示Null值。



执行后,我得到一个

  RangeError:Error#2006 :Der angegebene索引liegtaußerhalbdeszulässigenBereichs。 
(英文:索引超出范围)
在ObjectInput / readObject()
在mx.collections :: ArrayList / readExternal()[E:\dev\4。 x \ frameworks \projects\framework\src\mx\collections\ArrayList.as:586]
在mx.collections :: ArrayCollection / readExternal()[E:\dev\ 4.x \ frameworks \projects\framework\src\mx\collections\ArrayCollection.as:147)
在ObjectInput / readObject()
在mx.messaging.messages: :AbstractMessage / readExternal()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\messages\AbstractMessage.as:486)
在mx.messaging.messages :: AsyncMessage / readExternal()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\messages\AsyncMessage.as :170]
在mx.messaging.messages :: Ac knowledgeMes​​sage / readExternal()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\messages\AcknowledgeMes​​sage.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实现了Serializable,Externalizable {

private static final long serialVersionUID = 788620879056753289L;

私人整数ID;

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

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


getter,ID和hashCode的setter,等于
$ b @Override
public void writeExternal(ObjectOutput out)throws IOException {
out.writeObject(this.nullToNegative(this.id));

$ b @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();


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






$ b $我们使用Gas3花岗岩数据服务代码生成:

$
*由Gas3 v2.1.0生成(花岗岩数据服务)。
*
* /
package crux.domain.dto {

import flash.utils.IExternalizable;

[Bindable]
public class NullAbleIDBase {

public function NullAbleIDBase(){}

$ b private var _id:数;

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





写入外部

pre $ 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);



code
$ b我已经花了几个小时这个问题,但我不知道是什么问题。
您是否看到异常的原因?

解决方案

不知道是什么原因的问题,因为我不知道BlazeDS,但是你的<$ c $的方法 readExternal writeExternal c> NullAbleID 类不是对称的:你在 writeExternal 中编写一个Integer类型的对象,并且读取 readExternal


I am using BlazeDS to communicate between Java and Flash/Flex. And everything works fine, except that Java Null Integer becomes 0 on Flex side.

To handle the problem with transferring a Java Null Integer to an Flash/Flex int, I have implement a custom serialization, which works on the Java side and uses negative values to express Null values.

After implementing that I get an

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]

The exception occures on the Flex side while deserializing the Java Result. Which is an list of complex objects which contains this special class with the custom serialization. Because there was no such problem until I added the custom serialization, I guess it must belong to the problem, but i have no clue what triggers the exception.

This is the code of the object with the custom serialization:

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: two classes, because we use Gas3 Granite Data Service code generation:

/**
* 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 sub class with read and write external

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

I have spend several hours on this problem, but I have no idea what the problem is. Do you see the cause for the exception?

解决方案

Not sure it's the cause of the problem, because I don't know BlazeDS, but the methods readExternal and writeExternal of your NullAbleID class are not symetric : you write an object of type Integer in writeExternal, and you read an int in readExternal.

这篇关于BlazeDS自定义序列化会导致RangeError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆