Class 不会在 GWT 应用程序中序列化

Class will not serialize in GWT application

com.google.gwt.user.client.rpc.SerializationException: 
Type 'NaturalOrderComparator' was not included in the set of types which 
can be serialized by this SerializationPolicy or its Class object could
not be loaded. For security purposes, this type will not be serialized.: 
instance = NaturalOrderComparator@35d9c40d

我省略了包名称,但是 .class 文件位于 GWT 的客户端和服务器代码都可以访问的包中。

有问题的 class 是从 https://raw.githubusercontent.com/paour/natorder/master/NaturalOrderComparator.java 中提取的。我修改了 class 只是为了指定它实现 Comparator<String> 而不是原始类型 Comparator,我尝试同时使用 IsSerializableSerializable 接口无济于事.现在它正在使用 IsSerializable.

这是堆栈跟踪的前 5 行

at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:665)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
at com.google.gwt.user.client.rpc.core.java.util.TreeMap_CustomFieldSerializer.serialize(TreeMap_CustomFieldSerializer.java:47)
at com.google.gwt.user.client.rpc.core.java.util.TreeMap_CustomFieldSerializer.serializeInstance(TreeMap_CustomFieldSerializer.java:71)
at com.google.gwt.user.client.rpc.core.java.util.TreeMap_CustomFieldSerializer.serializeInstance(TreeMap_CustomFieldSerializer.java:29)

如果它是一个简单的 Comparator 实现,请不要 return 它在 entity/bean 对象中,而是将它放在 .client.* 中,以便它可以被编译。这样客户端和服务端都可以使用。如果您必须将它放在对象中,则将其设置为瞬态的,这样它就不会被序列化。通常有另一个名为 shared 的包,并确保您的 .gwt.xml 文件具有 <source path='shared' />,以便编译器将在共享包中编译 类。

我打赌 Character.isSpaceChar - 令人惊讶的是,GWT doesn't emulate it and this could lead to this class not being serializable. GWT does however emulate the deprecated Character.isSpace - 也许它可以满足你的需求?