2011-09-22 9 views
0

私のアプリケーションでは、サーバーにあるファイルからデータを取得しています。データはテキストファイル(.obj)に格納されているので、ファイルを読み込んでデータを取得するためにrpcを使用しています。ファイルはサードパーティのライブラリを使って読み込まれますhttp://www.pixelnerve.com/processing/libraries/objimport/ ArrayListを使ってクライアントにデータを送りますが、基本的には次のようにします: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]

他の質問もチェックされていますが、問題はデシリアライゼーションに関するものですが、具体的なものは見つかりませんでした。

問題は、アプリケーションをホストモードで正常に動作させるにはどうすればよいですか?成功したRPCを使用するには

+0

「Vertex3dはシリアライザブルです」というのは、java.io.Serializableを実装しているということですか?その構造は正確に何ですか? –

+0

これは変です...あなたはVertex3DインスタンスでArrayListを送信していますか? GWTが何かをシリアル化できない場合、GWTは何かをシリアル化します。 – Luismahou

+0

私は質問にコードの一部を追加したので、クラスの仕組みを見ることができます。 – sosegon12

答えて

0

あなたは、これがシリアル化の問題であることを確認してきました?ホストされたモードでワイヤを介してDTOの配列リストを渡す簡単なRPCテストメソッドを書くことができます。

私が推測してお金を賭けるなら、問題は配列リストがホストモ​​ードで空に送信されるということです。読み込まれた.objファイルが問題になる可能性があります。恐らくホストされたモードでは、ファイル操作がtry catchブロックにあり、例外がおそらく飲み込まれる可能性があるため、ファイルのパスはdevモードのように一致しません(おそらく異なるサーバー構成ですか?)。

短い単語ですが、これらのアレイリストがホストモ​​ードで空に送信されていないことを確認しましたか?

+0

はい、関数はデータを送信していないことがわかりますその場所にあるファイルを開くことができません。だから問題は、objファイルのパスについてです。 – sosegon12

1

、あなたのオブジェクトはSerializable を実装する必要もあなたのオブジェクトはよくシリアライズデフォルトの引数なしのコンストラクタ

+0

はい、そのようなオブジェクトです。私は質問にコードの一部を追加しました – sosegon12

0

であってもよいしているはずですが、それはリモートプロシージャコールで使用可能なものに一致しません。あなたは(必要に応じてsuper()を呼び出します)引数なしでデフォルトコンストラクタを持って、Serializableを実装する必要がある、とシリアルバージョン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

注:Javaコンパイラが自動的に入れているので、必ずしも 'super()'を持つ必要はありません。 –

関連する問題