Gwt 字符串数组上的序列化异常

Gwt 字符串数组上的序列化异常,gwt,gwt-rpc,Gwt,Gwt Rpc,我遗漏了一些东西: 其中明确说明了序列化的内容: 类型是可序列化类型(包括其他类型)的数组 可序列化数组) 但是,我无法序列化新字符串[]{“s”} 以下是我得到的一个例外: com.google.gwt.user.client.rpc.SerializationException at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153) at com

我遗漏了一些东西:

其中明确说明了序列化的内容:

类型是可序列化类型(包括其他类型)的数组 可序列化数组)

但是,我无法序列化
新字符串[]{“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;
    }  

我在GWT代码中使用了字符串数组,用于客户端和服务器之间的通信。我相信您的问题在于您正在尝试序列化HashMap。

我在GWT代码中使用了字符串数组来实现客户端和服务器之间的通信。我相信您的问题在于您正在尝试序列化HashMap。

尝试使用泛型声明所有可序列化的集合。例如,GreetingService中的方法应为:

String greetServer(ArrayList<HashMap<String, String[]>> name) throws IllegalArgumentException;
字符串greetServer(ArrayList名称)抛出IllegalArgumentException;

并用类型化版本替换对ArrayList的所有其他引用。GWT使用泛型声明来验证集合的内容是否可序列化,如果您不提供它们,它通常会给出错误。

尝试使用泛型声明所有可序列化集合。例如,GreetingService中的方法应为:

String greetServer(ArrayList<HashMap<String, String[]>> name) throws IllegalArgumentException;
字符串greetServer(ArrayList名称)抛出IllegalArgumentException;


并用类型化版本替换对ArrayList的所有其他引用。GWT使用泛型声明来验证集合的内容是可序列化的,如果您不提供它们,它通常会给出错误。

是否可以包含异常?我认为发送一个HashMap是可以的(发送一个Map也可以,但是对于GWT-RPC,他们甚至建议使用具体的类,只为需要的内容生成序列化代码),只是为了测试,您可以尝试序列化
HashMap
(作为一个包含数组的类的容器)。或者,
HashMap
。我知道医生不是这么说的。。。但是如果它能工作的话,它可以提供一些信息……我发布了一个例外。我会尝试你所建议的,一个包含许多数组的哈希映射数组是个坏主意,即使它可以工作。简化数据结构。你能包括例外情况吗?我认为发送一个HashMap是可以的(发送一个Map也可以,但是对于GWT-RPC,他们甚至建议使用具体的类,只为需要的内容生成序列化代码),只是为了测试,您可以尝试序列化
HashMap
(作为一个包含数组的类的容器)。或者,
HashMap
。我知道医生不是这么说的。。。但是如果它能工作的话,它可以提供一些信息……我发布了一个例外。我会尝试你所建议的,一个包含许多数组的哈希映射数组是个坏主意,即使它可以工作。简化数据结构。我从未使用过GWT-RPC。我使用与Spring REST服务或RequestFactory后端接口的GWT前端。在Java对象和JavaScript对象之间进行转换时,不能使用所需的任何数据结构。Java数组(例如String[])转换为JavaScript数组(例如JsArray)以在客户端上使用。我会使用一个字符串数组数组,或者创建您自己的可序列化对象,其中包含您需要的数据。我从未使用过GWT-RPC。我使用与Spring REST服务或RequestFactory后端接口的GWT前端。在Java对象和JavaScript对象之间进行转换时,不能使用所需的任何数据结构。Java数组(例如String[])转换为JavaScript数组(例如JsArray)以在客户端上使用。我会使用一个字符串数组数组,或者创建您自己的可序列化对象,其中包含您需要的数据。对于通信,我使用一个我无法控制的数据结构。它是为swing应用程序创建的。对于GWT应用程序,我将所有无法序列化的内容转换为ArrayList和HashMaps,并且可以正常工作,但我注意到String[]并不总是有效。我希望有些东西是可序列化的,或者它不符合文档要求。@DavidLevesque是对的。您应该只使用可序列化类型。
ArrayList
是一个Àrrayist`。不可序列化。如果无法控制服务器类型,请转换它们。您肯定必须实现GWTService层(服务器上服务接口的实现)。所以你可以使用泛型。如果您需要复制数组并逐个传递项,请执行该操作。@Helios:“ArrayList是ÀrrayList。不可序列化”。我会序列化HashMaps和ArrayList,它们不使用泛型。它起作用了。我读过不使用泛型的做法。是否有一个链接声明没有泛型的HashMaps/ArrayList不能序列化?如果是标准文档,我会找到的。我同意无论如何都必须创建这个GWTService层。它确实存在,但它只转换绝对必要的内容。@user905374:不,只是猜测它不可能,因为GWT应该为每个项生成序列化,而作为“?”它应该抱怨序列化对象。但我不确定。@user905374:还有一件事。在DevMode中有一些东西是可以工作的,因为(我认为)它不需要转换成JavaScript很多东西。它可以使用所有的JRE类。对于通信,我使用一个我无法控制的数据结构。它是为swing应用程序创建的。对于GWT应用程序,我将所有无法序列化的内容转换为ArrayList和HashMaps,并且可以正常工作,但我注意到String[]并不总是有效。我希望有些东西是可序列化的,或者它不符合文档要求。@DavidLevesque是对的。您应该只使用可序列化类型。
ArrayList
是一个Àrrayist`。不可序列化。如果无法控制服务器类型,请转换它们。您肯定必须实现GWTService层(服务器上服务接口的实现)。所以你可以使用泛型。如果需要复制数组并逐个传递项,请执行此操作@
String greetServer(ArrayList<HashMap<String, String[]>> name) throws IllegalArgumentException;