Пользовательская сериализация BlazeDS вызывает RangeError - PullRequest
0 голосов
/ 11 февраля 2011

Я использую BlazeDS для связи между Java и Flash / Flex. И все работает отлично, за исключением того, что Java Null Integer становится 0 на стороне Flex.

Чтобы решить проблему с передачей 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]

Исключение возникает на стороне Flex при десериализации результата 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);
        }
    }
}

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

Я потратил несколько часов на эту проблему, но я понятия не имею, в чем проблема. Видите ли вы причину исключения?

1 Ответ

2 голосов
/ 11 февраля 2011

Не уверен, что это является причиной проблемы, потому что я не знаю BlazeDS, но методы readExternal и writeExternal вашего NullAbleID класса не симметричны: вы пишете объект типа Integer в writeExternal, и вы читаете int в readExternal.

...