【问题标题】:Deserialization of ArrayList GWTArrayList GWT 的反序列化
【发布时间】:2011-09-22 04:08:22
【问题描述】:

在我的应用程序中,我从位于服务器中的文件中获取一些数据。数据存储在文本文件 (.obj) 中,因此我使用 rpc 来读取文件并获取数据。使用第三方库http://www.pixelnerve.com/processing/libraries/objimport/ 读取文件我使用ArrayLists 将数据发送到客户端,基本上我发送的是:ArrayList[ArrayList[Vertex3dDTO]] 其中Vertex3dDTO 是一个包含浮点参数的可序列化对象。 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/415975576​​0"], 0,7]

所以,我已经检查了一些其他问题,似乎问题与反序列化有关,但我没有发现任何具体的问题。

问题是我必须做些什么才能让应用在托管模式下正常运行?

【问题讨论】:

  • Vertex3d is an serializable 是不是意味着它只是实现了java.io.Serializable?它的结构究竟是什么?
  • 这很奇怪...您确定要发送带有 Vertex3D 实例的 ArrayList 吗?如果 GWT 不能序列化某些东西,它会报错。
  • 我已将部分代码添加到问题中,因此您可以查看类的情况。

标签: gwt arraylist rpc deserialization


【解决方案1】:

要成功使用 RPC,您的对象需要实现 Serializable 并且还应该有一个默认的无参数构造函数

【讨论】:

  • 是的,对象就是这样。我已将部分代码添加到问题中
【解决方案2】:

您确定这是一个序列化问题吗?您可以编写一个简单的 RPC 测试方法,以在托管模式下通过网络传递您的 DTO 的数组列表。

如果我在猜测上赌钱,我会说问题是那些数组列表在托管模式下发送为空。读取的 .obj 文件可能是问题所在。也许在托管模式下,文件的路径与在开发模式下不匹配(可能是不同的服务器配置?),因为文件操作在 try catch 块中,所以很可能会吞下异常。

长话短说,您确定这些数组列表在托管模式下不会为空吗?

【讨论】:

  • 是的,结果该函数没有发送任何数据,因为无法在该位置打开文件。所以,问题在于 obj 文件的路径。
【解决方案3】:

您的对象可能是可序列化的,但这并不等同于远程过程调用可用的东西。您需要实现Serializable,有一个不带参数的默认构造函数(如果需要,它会调用super())和一个序列版本ID,如下所示:

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

【讨论】:

  • 注意:你不一定非得有super(),因为Java编译器会自动把它放进去。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2013-05-07
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多