2012-09-24 19 views
0

有我丟失的東西:SerializationException的字符串數組

Serializable Types它明確地說什麼連載:

類型是序列化類型(包括其他 序列化數組)的數組。

但是我不能序列new String[]{"s"}

public void onModuleLoad() 
{ 

    HashMap<String, String[]> p = new HashMap<String, String[]>(); 
    p.put("xxx", new String[]{"s"}); 

    ArrayList params = new ArrayList(); 
    params.add(p); 


    greetingService.greetServer(params, new AsyncCallback<String>() 
    { 

     @Override 
     public void onSuccess(String result) 
     { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onFailure(Throwable caught) 
     { 
      caught.printStackTrace(); 

     } 
    }); 
    } 

在另一方面,我可以序列化此:

ArrayList list = new ArrayList(); 
    list.add("s"); 

這裏是例外,我得到:

com.google.gwt.user.client.rpc.SerializationException 
    at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153) 
    at com.google.gwt.user.client.rpc.impl.SerializerBase.serialize(SerializerBase.java:125) 
    at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamWriter.serialize(ClientSerializationStreamWriter.java:183) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase.serialize(Map_CustomFieldSerializerBase.java:53) 
    at com.google.gwt.user.client.rpc.core.java.util.HashMap_CustomFieldSerializer.serialize(HashMap_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.HashMap_FieldSerializer.serial(HashMap_FieldSerializer.java:23) 
    at com.google.gwt.user.client.rpc.impl.SerializerBase.serialize(SerializerBase.java:126) 
    at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamWriter.serialize(ClientSerializationStreamWriter.java:183) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_FieldSerializer.serial(ArrayList_FieldSerializer.java:23) 
    at com.google.gwt.user.client.rpc.impl.SerializerBase.serialize(SerializerBase.java:126) 
    at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamWriter.serialize(ClientSerializationStreamWriter.java:183) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.example.client.GreetingService_Proxy.greetServer(GreetingService_Proxy.java:31) 
    at com.example.client.AnotherTest.onModuleLoad(AnotherTest.java:56) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396) 
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200) 
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:525) 
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363) 
    at java.lang.Thread.run(Thread.java:662) 

這裏的服務:

@RemoteServiceRelativePath("greet") 
    public interface GreetingService extends RemoteService 
    { 
     String greetServer(ArrayList name) throws IllegalArgumentException; 
    } 
+1

你能包括例外嗎?我認爲發送一個HashMap是可以的(發送一個Map也可以,但是在GWT-RPC的情況下,他們甚至會推薦具體的類,只生成需要的序列化代碼) – helios

+0

僅用於測試,你可以嘗試序列化'HashMap '(SomeContainer是一個包含數組的類)。或者,'HashMap >'。我知道這不是什麼文件說...但它可以給一些光,如果它的工作... – helios

+0

我發佈了異常。我會嘗試你的建議 – Spiff

回答

3

嘗試用泛型聲明所有可序列化的集合。例如,GreetingService中的方法應該是:

String greetServer(ArrayList<HashMap<String, String[]>> name) throws IllegalArgumentException; 

並且還用類型化版本替換對ArrayList的所有其他引用。 GWT使用泛型聲明來驗證集合的內容是可序列化的,如果不提供它們,它通常會出錯。

+0

對於溝通,我使用了一個我無法控制的數據結構。它是爲一個swing應用程序創建的。對於GWT應用程序,我將所有無法序列化的東西轉換爲ArrayLists和HashMaps,並且可行,但我注意到使用String []它並不總是有效。我希望無論是可序列化的還是不符合文檔的。 – Spiff

+1

@DavidLevesque是對的。你應該只使用可序列化的類型。 ArrayList是一個列表'。不可序列化。如果你無法控制服務器類型轉換它們。你一定要實現GWTService層(在服務器上實現服務接口)。所以你可以使用泛型。如果您需要複製數組並逐個傳遞項目,請執行此操作。 – helios

+0

@Helios:「一個ArrayList是一個列表。不可序列化」。那麼我做序列化HashMaps和ArrayList,他們不使用泛型。有用。我讀過這不是不好的做法,不使用泛型。是否有鏈接指出沒有泛型的HashMap/ArrayLists不能被序列化?如果這是我找到的標準文檔。我同意我必須創建這個GWTService層。它確實存在,但它只轉換絕對必要的。 – Spiff

1

我在客戶端和服務器之間的通信中使用了我的GWT代碼中的字符串數組。我相信你的問題在於你試圖序列化HashMap。

+0

我從來沒有使用過GWT-RPC。我使用GWT前端與Spring REST服務或RequestFactory後端接口。在Java對象和JavaScript對象之間轉換時,不能使用任何您想要的數據結構。 Java Array(例如String [])被轉換爲JavaScript Array(例如JsArray )以供在客戶端上使用。我將使用一個String數組的數組,或者創建包含您所需數據的自己的可序列化對象。 – 11101101b