2011-09-22 101 views
0

在我的应用程序中,我从位于服务器中的文件获取一些数据。数据存储在文本文件(.obj)中,所以我使用rpc来读取文件并获取数据。使用第三方库读取文件http://www.pixelnerve.com/processing/libraries/objimport/我使用ArrayLists将数据发送到客户端,基本上我发送这个:ArrayList [ArrayList [Vertex3dDTO]]其中Vertex3dDTO是包含浮点参数的可序列化对象。 ArrayList [Vertex3dDTO]包含在另一个可序列化的类Face3dDTO中,而ArrayList [Face3dDTO]包含在可序列化的类Group3dDTO中。ArrayList的反序列化GWT

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]

所以,我已经检查了一些其他问题,似乎问题是关于反序列化,但我没有找到具体的东西。

问题是我该怎么做才能让应用程序在托管模式下运行良好?

+0

'Vertex3d是一个可序列化的'是否意味着它只是实现了java.io.Serializable?它的结构究竟是什么? –

+0

这很奇怪......你确定你发送一个ArrayList Vertex3D实例吗? 如果GWT无法序列化一些东西,它会抱怨。 – Luismahou

+0

我已经将部分代码添加到了问题中,因此您可以看到这些类是如何工作的。 – sosegon12

回答

0

你是否确信这是一个序列化问题?您可以编写一个简单的RPC测试方法,以托管模式通过线路传递DTO的数组列表。

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

长词短,你确定这些数组列表不会在托管模式下发送空吗?

+0

是的,事实证明函数并未发送任何数据,因为无法在该位置打开文件。所以,问题是关于obj文件的路径。 – sosegon12

1

要成功使用RPC,你的对象需要实现Serializable 也应该有一个默认的无参数的构造

+0

是的,对象就是这样。我已经将代码的一部分添加到了问题 – sosegon12

0

你的对象可能是序列化的,但是,这并不等同于通过远程过程调用可用的东西。您需要实现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; 
} 
} 
+0

注意:您不一定必须拥有'super()',因为Java编译器会自动将其放入。 –