GWT序列化被破坏了?

GWT序列化被破坏了?,gwt,serialization,gwt-rpc,Gwt,Serialization,Gwt Rpc,我有一个相当简单的案例。我还简化了名称以便于阅读(见下文) 我有一个枚举和一个使用该枚举的用户定义类,以及一个字符串 根据GWT: 枚举应可序列化 用户定义的类应可序列化,因为: 它直接实现可序列化 它的非最终、非临时实例字段是可序列化的: 枚举是可序列化的 该字符串是可序列化的 它有一个默认(零参数)构造函数 尽管符合这些规则,但尝试使用这些类会导致以下错误: SEVERE: Exception while dispatching incoming RPC call com.google.

我有一个相当简单的案例。我还简化了名称以便于阅读(见下文)

我有一个枚举和一个使用该枚举的用户定义类,以及一个字符串

根据GWT:

  • 枚举应可序列化
  • 用户定义的类应可序列化,因为:
  • 它直接实现可序列化
  • 它的非最终、非临时实例字段是可序列化的:
  • 枚举是可序列化的
  • 该字符串是可序列化的
  • 它有一个默认(零参数)构造函数
尽管符合这些规则,但尝试使用这些类会导致以下错误:

SEVERE: Exception while dispatching incoming RPC call com.google.gwt.user.client.rpc.SerializationException: Type 'com.company.product.Bar 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 = com.company.product.Bar @4c19cc84
简单的例子

GWT搞砸了

它坏了吗

类型是可序列化的,如果满足以下条件之一,则可以在服务接口中使用该类型:

  • 类型是基本类型,例如char、byte、short、int、long、boolean、float或double
  • 字符串、日期或基本包装(如字符、字节、短、整数、长、布尔、浮点或双精度)的实例类型
  • 类型是枚举。枚举常量仅序列化为名称;所有字段值均未序列化
  • 该类型是可序列化类型(包括其他可序列化数组)的数组
  • 该类型是可序列化的用户定义类
  • 该类型至少有一个可序列化的子类
  • 该类型具有自定义字段序列化程序
如果以下所有条件均适用,则用户定义的类是可序列化的:

  • 它可以分配给IsSerializable或Serializable,这是因为它直接实现了这些接口中的一个,或者是因为它派生自一个实现这些接口的超类
  • 所有非最终、非临时实例字段本身都是可序列化的,并且
  • 从GWT1.5开始,它必须有一个默认(零参数)构造函数(带有任何访问修饰符),或者根本没有构造函数
  • Foo.java

    public enum Foo {
     A, B, C;
    }
    
    java

    public class Bar implements Serializable {
    
     private static final long serialVersionUID = 604131643709466885L;
     private Foo foo;
     private String S;
    
     public Bar() {
     }
    
     public Foo getFoo() {
         return foo;
     }
     public void setFoo(Foo foo) {
         this.foo = foo;
     }
     public String getS() {
         return S;
     }
     public void setS(String S) {
         this.S = S;
     }
    }
    
    类型“com.company.product.Bar”未包含在此可由此序列化策略序列化的类型集中或其类对象无法加载。出于安全目的,不会序列化此类型

    由于您已经非常清楚地遵循了它提到的特定规则,这就剩下了另一半—序列化策略本身可能有问题。有两种主要情况会发生这种情况——要么服务器上不存在策略(或者策略已过期,实际上是同一种情况),要么策略不包含该类型,因为RPC无法访问该类型(不在客户端源路径上,显式列入黑名单,不可分配给预期类型之一-java.lang.Object正在欺骗)

    如果文件完全丢失或过期,服务器将不会发送或接收它正在查看的类型。如果过时了,客户机和服务器对什么类型可以通过连接有不同的想法。每个rpc调用都包含对用于该调用的策略文件的引用-客户端和服务器需要保持同步。另一方面,如果由于RPC生成器确定该类型不合法而无法通过连线发送对象,则需要更改RPC接口(或引用类型)以正确引用它

    除此之外,还需要更多详细信息-您的RPC接口是什么,服务器上的任何其他日志消息是什么,服务器上是否存在
    *.gwt.RPC
    文件

    类型“com.company.product.Bar”未包含在此可由此序列化策略序列化的类型集中或其类对象无法加载。出于安全目的,不会序列化此类型

    由于您已经非常清楚地遵循了它提到的特定规则,这就剩下了另一半—序列化策略本身可能有问题。有两种主要情况会发生这种情况——要么服务器上不存在策略(或者策略已过期,实际上是同一种情况),要么策略不包含该类型,因为RPC无法访问该类型(不在客户端源路径上,显式列入黑名单,不可分配给预期类型之一-java.lang.Object正在欺骗)

    如果文件完全丢失或过期,服务器将不会发送或接收它正在查看的类型。如果过时了,客户机和服务器对什么类型可以通过连接有不同的想法。每个rpc调用都包含对用于该调用的策略文件的引用-客户端和服务器需要保持同步。另一方面,如果由于RPC生成器确定该类型不合法而无法通过连线发送对象,则需要更改RPC接口(或引用类型)以正确引用它


    除此之外,还需要更多详细信息-您的RPC接口是什么,服务器上的任何其他日志消息是什么,服务器上是否存在
    *.gwt.RPC
    文件?

    您的类在客户端和服务器端可用吗

    包名“com.company.product.Bar”表示该类可能不在正确的包中。在GWT中,通常有这样的包结构:

    +- root package
       !
       +- client
       !
       +- server
       !
       +- shared
       !  ! 
       !  +- YourDTO.java
       !
       +- YourModuleDescriptor.gwt.xml
    

    您的DTO应该位于共享包中

    您的类在客户端和服务器端可用吗

    包名“com.company.product.Bar”表示该类可能不在正确的包中。在GWT中,通常有这样的包结构:

    +- root package
       !
       +- client
       !
       +- server
       !
       +- shared
       !  ! 
       !  +- YourDTO.java
       !
       +- YourModuleDescriptor.gwt.xml
    
    您的DTO应该位于共享包中