Gwt HashBiMap SerializationException或如何序列化IsSerializable不适用的类?
问题似乎是,并非所有的番石榴类都是可即时序列化的 我找到了一个很好的解决方案,并愿意与大家分享。(在本例中为HashBiMap)。 (可能有一天,一些Guava开发人员会将此应用于所有类) 如果您复制下面的类(并可能将其调整为可序列化的类),您将在Javadoc注释中获得进一步的调查详细信息Gwt HashBiMap SerializationException或如何序列化IsSerializable不适用的类?,gwt,serialization,guava,Gwt,Serialization,Guava,问题似乎是,并非所有的番石榴类都是可即时序列化的 我找到了一个很好的解决方案,并愿意与大家分享。(在本例中为HashBiMap)。 (可能有一天,一些Guava开发人员会将此应用于所有类) 如果您复制下面的类(并可能将其调整为可序列化的类),您将在Javadoc注释中获得进一步的调查详细信息 package com.google.common.collect; import java.util.LinkedHashMap; import java.util.Map; import com.g
package com.google.common.collect;
import java.util.LinkedHashMap;
import java.util.Map;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
/**
* idea taken from some <a href=
* "http://code.google.com/r/baggiogamp-guava/source/browse/gwt-src/com/google/common/collect/RegularImmutableBiMap_CustomFieldSerializer.java?r=a7aa10ddb815ce7996f3fae103bfd3823b1336ed&spec=svn6923b5fac0feb7005429d0b24be93b91685f9637"
* >com/google/common/collect/RegularImmutableBiMap_CustomFieldSerializer.java</
* a> <br/>
* Problem was, that {@link HashBiMap} seems not to be serializable for GWT:
* <ul>
* <li>it nor its super classes do not implement com.google.gwt.user.client.rpc.IsSerializable (why?)</li>
* <li>the following solution does not work if only applied to some super class, e.g. AbstractBiMap</li>
* </ul>
* <pre>
* com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: The response could not be deserialized
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:221)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.GeneratedMethodAccessor119.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
at sun.reflect.GeneratedMethodAccessor116.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)
Caused by: com.google.gwt.user.client.rpc.SerializationException: com.google.common.collect.HashBiMap/1352983899
at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153)
at com.google.gwt.user.client.rpc.impl.SerializerBase.instantiate(SerializerBase.java:114)
at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:396)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
at mycomp.shared.conf.Config_FieldSerializer.deserialize(Config_FieldSerializer.java:12)
at mycomp.shared.conf.Config_FieldSerializer.deserial(Config_FieldSerializer.java:35)
at com.google.gwt.user.client.rpc.impl.SerializerBase.deserialize(SerializerBase.java:95)
at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:398)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter$ResponseReader$8.read(RequestCallbackAdapter.java:106)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:214)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.GeneratedMethodAccessor119.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
at sun.reflect.GeneratedMethodAccessor116.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)
* </pre>
*
* @author ADietrich
*
*/
public class HashBiMap_CustomFieldSerializer {
public static void deserialize(SerializationStreamReader reader,
HashBiMap<?, ?> instance) {
}
public static HashBiMap<Object, Object> instantiate(
SerializationStreamReader reader) throws SerializationException {
Map<Object, Object> entries = new LinkedHashMap<Object, Object>();
Map_CustomFieldSerializerBase.deserialize(reader, entries);
return HashBiMap.create(entries);
}
public static void serialize(SerializationStreamWriter writer,
HashBiMap<?, ?> instance) throws SerializationException {
Map_CustomFieldSerializerBase.serialize(writer, instance);
}
}
package com.google.common.collect;
导入java.util.LinkedHashMap;
导入java.util.Map;
导入com.google.gwt.user.client.rpc.SerializationException;
导入com.google.gwt.user.client.rpc.SerializationStreamReader;
导入com.google.gwt.user.client.rpc.SerializationStreamWriter;
导入com.google.gwt.user.client.rpc.core.java.util.Map\u CustomFieldSerializerBase;
/**
*这个想法来源于一些com/google/common/collect/regulammutablebimap\u CustomFieldSerializer.java
*问题是,{@link HashBiMap}对于GWT似乎不可序列化:
*
*- 它及其超类都没有实现com.google.gwt.user.client.rpc.IsSerializable(为什么?)
*- 如果仅应用于某些超类,例如AbstractBiMap,则以下解决方案不起作用
*
*
*com.google.gwt.user.client.rpc.CompatibileMoteServiceException:无法反序列化响应
在com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived上(RequestCallbackAdapter.java:221)
在com.google.gwt.http.client.Request.fireOnResponseReceived上(Request.java:287)
位于com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.GeneratedMethodAccessor119.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于com.google.gwt.dev.shell.MethodAdapter.invoke(methodAdapter.java:103)
位于com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
位于com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
在com.google.gwt.dev.shell.BrowserChannelServer.ReactToMessages上等待返回(BrowserChannelServer.java:338)
在com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript上(BrowserChannelServer.java:219)
在com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
位于com.google.gwt.dev.shell.ModuleSpace.invokenactive(ModuleSpace.java:571)
位于com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
位于com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
位于com.google.gwt.core.client.impl.impl.apply(impl.java)
位于com.google.gwt.core.client.impl.impl.entry0(impl.java:242)
位于sun.reflect.GeneratedMethodAccessor116.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于com.google.gwt.dev.shell.MethodAdapter.invoke(methodAdapter.java:103)
位于com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
位于com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
位于com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
位于com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
在com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
位于java.lang.Thread.run(未知源)
原因:com.google.gwt.user.client.rpc.SerializationException:com.google.common.collect.HashBiMap/1352983899
位于com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153)
在com.google.gwt.user.client.rpc.impl.SerializerBase.instantiate(SerializerBase.java:114)上
位于com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:396)
位于com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
在mycop.shared.conf.Config\u FieldSerializer.deserialize(Config\u FieldSerializer.java:12)
在mycop.shared.conf.Config\u FieldSerializer.deserial(Config\u FieldSerializer.java:35)
在com.google.gwt.user.client.rpc.impl.SerializerBase.deserialize(SerializerBase.java:95)上
位于com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:398)
位于com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
位于com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter$ResponseReader$8.read(RequestCallbackAdapter.java:106)
位于com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:214)
在com.google.gwt.http.client.Request.fireOnResponseReceived上(Request.java:287)
位于com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.GeneratedMethodAccessor119.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于com.google.gwt.dev.shell.MethodAdapter.invoke(methodAdapter.java:103)
位于com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
位于com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
在com.google.gwt.dev.shell.BrowserChannelServer.ReactToMessages上等待返回(BrowserChannelServer.java:338)
在com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript上(BrowserChannelServer.java:219)
在com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
位于com.google.gwt.dev.shell.ModuleSpace.invokenactive(ModuleSpace.java:571)
在com.google.gw