2011-10-07 55 views
1

我正在使用GWT 2.4。我有序列化問題。我的服務有一個方法...GWT:由序列化錯誤屏蔽

@RemoteServiceRelativePath("retrieveChild") 
public interface ChildRetrievalService extends RemoteService { 
    ... 
    Collection<Node> getRootNodes(); 

它用我的「節點」類的定義如下......

public class Node implements Serializable { 

    private Long id; 
    private Node parent; 
    private String info; 
    private List<Node> children; 

    public Node() { 
     this.children = new ArrayList<Node>(); 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } // setId 

    public Node getParent() { 
     return parent; 
    } 

    public void setParent(Node parent) { 
     this.parent = parent; 
    } 

    public String getInfo() { 
     return info; 
    } 

    public void setInfo(String info) { 
     this.info = info; 
    } // setInfo 

    public List<Node> getChildren() { 
     return children; 
    } 

    public boolean equals(Object node) { 
     return node != null && 
      node instanceof Node && 
      ((Node) node).getId() == id; 
    } 

    public int hashCode() { 
     return getId().hashCode(); 
    } 

} 

但我發現了試圖調用該服務方法時出現錯誤,抱怨序列化。 HashMap和Node都是可序列化的,所以一切都崩潰了?

[WARN] Exception while dispatching incoming RPC call 

com.google.gwt.user.client.rpc.SerializationException:類型「的java.util.HashMap $值」是不包括在該組的類型可以由本SerializationPolicy或其類對象被序列無法加載。出於安全目的,這種類型不會被序列化。:instance = [[email protected][email protected][email protected][email protected][email protected]] at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619 ) at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write( ServerSerializationStreamWriter.java:153) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539) at com.google.gwt.user.server.rpc.RPC.encodeResponse( RPC。 java:616) at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java: 571) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 在com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在javax.servlet.http包。 HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.Servl (org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler。 HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:324) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:50 5) at org.mortbay.jetty.HttpConnection $ RequestHandler.content(HttpConnection.java:843) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) at org.mortbay.jetty.HttpParser。 (org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) at org。 mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool。的java:488)

謝謝, - 戴夫

+1

我想嘗試把它在遠程服務接口中的具體類型的集合。有時GWT可能會對其白名單或不白名錶感到厭煩。 –

回答

2

不能使用用於爲GWT RPC方法參數的抽象類型(或接口):

當前GWT RPC系統是基於圍繞着 具體類型的序列化。在一般情況下,在客戶端和服務器上必須具有相同的具體類型 。雖然自定義 序列化器可用於更改 客戶機或服務器中使用的實際類型,但序列化類型必須知道要使用的 序列化程序。當使用(抽象)類型聲明RPC接口 時,這是有問題的,其中在服務器上實現了任意多個 實現。

查看here瞭解詳情。

歸結爲RPC機制不能序列化你的參數,因爲它不知道它真的會是什麼。或者,任何序列化任何可能的具體實現的方法都不實際。所以你必須選擇最適合你需要的具體課程。

1

始終對RPC中使用的數據使用具體類型。因爲GWT編譯器需要爲所有子類生成實現,因爲它不知道將從服務器發送的子類型。這可能意味着某些類型或接口可能會導致大量開銷,添加大量類型,這些類型從不使用。例如,你知道你只使用ArrayList,當你有一個指定的列表。

這可能也會導致此錯誤,因爲它想添加一個不能序列化的子類型。