Gwt HashBiMap SerializationException或如何序列化IsSerializable不适用的类?

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

问题似乎是,并非所有的番石榴类都是可即时序列化的

我找到了一个很好的解决方案,并愿意与大家分享。(在本例中为HashBiMap)。 (可能有一天,一些Guava开发人员会将此应用于所有类)

如果您复制下面的类(并可能将其调整为可序列化的类),您将在Javadoc注释中获得进一步的调查详细信息

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