Десериализация ArrayList GWT - PullRequest
       9

Десериализация ArrayList GWT

0 голосов
/ 22 сентября 2011

В моем приложении я получаю некоторые данные из файла, расположенного на сервере. Данные хранятся в текстовом файле (.obj), поэтому я использую rpc для чтения файла и получения данных. Файл читается с использованием сторонней библиотеки http://www.pixelnerve.com/processing/libraries/objimport/ Я отправляю данные клиенту с помощью ArrayLists, в основном отправляю это: ArrayList [ArrayList [Vertex3dDTO]], где Vertex3dDTO - сериализуемый объект с содержанием float параметры. ArrayList [Vertex3dDTO] содержится в другом сериализуемом классе Face3dDTO, а ArrayList [Face3dDTO] находится в сериализуемом классе Group3dDTO.

package com.nyquicksale.tailorapp.shared;

import java.io.Serializable;

public class Vertex3dDTO implements Serializable {

    float x,y,z;

    public Vertex3dDTO(){

    }

    public Vertex3dDTO(float x, float y, float z){
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

public class Face3dDTO implements Serializable {

    ArrayList<Vertex3dDTO> vL = new ArrayList<Vertex3dDTO>();   
    Vertex3dDTO normal = new Vertex3dDTO();
    Vertex3dDTO color = new Vertex3dDTO();      

    public Face3dDTO(){

    }

    public Face3dDTO(ArrayList<Vertex3dDTO> v) {
        for(Vertex3dDTO v3dDTO : v){            
            vL.add(v3dDTO);         
        }
        updateNormal();
    }

public class Group3dDTO implements Serializable {

    ArrayList<Face3dDTO> fL = new ArrayList<Face3dDTO>();   

    String name;


    public Group3dDTO(){

    }   

    public Group3dDTO(ArrayList<Face3dDTO> f) {     
        for(Face3dDTO f3dDTO : f){
            fL.add(f3dDTO);
        }       
    }
}

Теперь все работает хорошо в режиме разработки, но когда я тестировал приложение в размещенном режиме, все, что я получаю в ответ: // OK [0,1, ["java.util.ArrayList / 4159755760"], 0,7]

Итак, я проверил некоторые другие вопросы и, похоже, проблема в десериализации, но я не нашел ничего конкретного.

Вопрос в том, что мне нужно сделать, чтобы приложение работало хорошо в размещенном режиме?

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Чтобы успешно использовать RPC, ваш объект должен реализовать Serializable , а также должен иметь конструктор по умолчанию no arg

0 голосов
/ 23 сентября 2011

Вы убедились, что это проблема сериализации? Вы можете написать простой метод тестирования RPC для передачи списка массивов ваших DTO по проводам в размещенном режиме.

Если бы я поставил деньги на догадку, я бы сказал, что проблема в том, что списки массивов отправляются пустыми в размещенном режиме. Чтение файла .obj может быть проблемой. Возможно, в размещенном режиме путь к файлу не совпадает, как в режиме разработки (возможно, с другой конфигурацией сервера?), Поскольку файловые операции находятся в блоке try catch, исключение, скорее всего, проглатывается.

Длинное слово короткое, Вы убедились, что списки массивов не отправляются пустыми в размещенном режиме?

0 голосов
/ 22 сентября 2011

Ваш объект вполне может быть Serializable, но это не равносильно чему-то, что можно использовать при удаленных вызовах процедур. Вам необходимо реализовать Serializable, иметь стандартный конструктор без аргументов (при необходимости вызывающий super()) и последовательный идентификатор , например:

public class MyObject implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -1796729355279100558L;

private Float someValue;

public MyObject() {
    super();
}

public MyObject(Float someValue) {
    super();
    this.someValue = someValue;
}

public Float getSomeValue() {
    return someValue;
}

public void setSomeValue(Float someValue) {
    this.someValue = someValue;
}
}
...