无法将枚举序列化为GWT

无法将枚举序列化为GWT,gwt,serialization,enums,Gwt,Serialization,Enums,如果枚举实现java.io.Serializable,我无法将其序列化为GWT。它将成功地编译GWT,但在运行时,我得到了可怕的结果: 类型“com….security..AdminPrivilege”不可分配给“com.google.gwt.user.client.rpc.IsSerializable”,并且没有自定义字段序列化程序。出于安全目的,将不会序列化此类型。示例=登录到控制台 如果我实现com.google.gwt.user.client.rpc.IsSerializable,它的编

如果枚举实现java.io.Serializable,我无法将其序列化为GWT。它将成功地编译GWT,但在运行时,我得到了可怕的结果:

类型“com….security..AdminPrivilege”不可分配给“com.google.gwt.user.client.rpc.IsSerializable”,并且没有自定义字段序列化程序。出于安全目的,将不会序列化此类型。示例=登录到控制台

如果我实现com.google.gwt.user.client.rpc.IsSerializable,它的编译和运行都很好。我试图避免IsSerializable,因为这个枚举在我们的数据库中被持久化,并且在非GWT servlet中被引用。我不想引入GWT依赖性,即使是对于单个类

我已经阅读了关于这个话题的大部分讨论。我有:

  • 添加了serialVersionUid(这应该不是必需的)
  • 添加了一个无参数构造函数(但这是一个枚举,因此它必须是私有的-我怀疑这可能是问题所在)
  • 添加了一个可调用的RPC方法,该方法返回枚举并将一组枚举作为输入参数(尝试将此枚举放入白名单)——
  • 对于所有其他枚举,我生成了一个实现IsSerializable的GWT版本。但是这个新的枚举太复杂,无法生成,我需要GWT代码中枚举的方法

    谢谢你在这方面的帮助

    我的枚举如下。请注意,它有一个嵌入的枚举:

    public enum AdminPrivilege implements java.io.Serializable {
    
        // Privileges
        MANAGE_XX("Manage XX", PrivilegeCategory.XX), 
        IMPORT_LICENSE("Import a License", PrivilegeCategory.XX), 
        SUBMIT_BUG("Submit a Bug", PrivilegeCategory.XX), 
        TEST_AD("Test AD", PrivilegeCategory.XX),
    
        // Administrator Privileges
        LOGIN("Login to XX", PrivilegeCategory.ADMIN), 
        MANAGE_ADMIN("Manage Administrators", PrivilegeCategory.ADMIN), 
        MANAGE_ROLE("Manage Roles", PrivilegeCategory.ADMIN),
    
        // Task Privileges
        CANCEL_TASK("Cancel Tasks", PrivilegeCategory.TASK), ;
    
        private static final long serialVersionUID = 1L;
    
        /**
         * Defines the privilege categories.
         * 
         */
        public enum PrivilegeCategory implements java.io.Serializable {
    
            XX("XX"), 
            ADMIN("Administrator"), 
            TASK("Task"), ;
    
            private static final long serialVersionUID = 2L;
    
            private String displayValue;
    
            // This constructor is required for GWT serialization
            private PrivilegeCategory() {
            }
    
            private PrivilegeCategory(String displayValue) {
                this.displayValue = displayValue;
            }
    
            @Override
            public String toString() {
                return displayValue;
            }
        }
    
        private String displayValue;
        private AdminPrivilege parentPrivilege;
        private PrivilegeCategory privilegeCategory;
    
        // This constructor is required for GWT serialization
        private AdminPrivilege() {
        }
    
        private AdminPrivilege(String displayValue, PrivilegeCategory category) {
            this.displayValue = displayValue;
            this.privilegeCategory = category;
        }
    
        private AdminPrivilege(String displayValue, PrivilegeCategory category, AdminPrivilege parent) {
            this(displayValue, category);
            this.parentPrivilege = parent;
        }
    
        /**
         * Return the parent privilege for this privilege.
         * 
         * @return
         */
        public AdminPrivilege getParentPrivilege() {
            return parentPrivilege;
        }
    
        /**
         * Return the category for this privilege.
         * 
         * @return
         */
        public PrivilegeCategory getPrivilegeCategory() {
            return privilegeCategory;
        }
    
        /**
         * Return the set of categories.
         * 
         * @return
         */
        public static Set<PrivilegeCategory> getPrivilegeCategories() {
            Set<PrivilegeCategory> category = new HashSet<PrivilegeCategory>();
            for (PrivilegeCategory c : PrivilegeCategory.values()) {
                category.add(c);
            }
            return category;
        }
    
        /**
         * Return the set of privileges for a category.
         * 
         * @return
         */
        public static Set<AdminPrivilege> getPrivileges(PrivilegeCategory category) {
            Set<AdminPrivilege> privileges = new HashSet<AdminPrivilege>();
            for (AdminPrivilege p : AdminPrivilege.values()) {
                if (category.equals(p.getPrivilegeCategory())) {
                    privileges.add(p);
                }
            }
            return privileges;
        }
    
        /**
         * Return the set of child privileges for a specific privilege
         * 
         * @param parent
         * @return
         */
        public static Set<AdminPrivilege> getChildPrivileges(AdminPrivilege parent) {
            Set<AdminPrivilege> children = new HashSet<AdminPrivilege>();
            for (AdminPrivilege priv : values()) {
                if (parent.equals(priv.getParentPrivilege())) {
                    children.add(priv);
                }
            }
            return children;
        }
    
        /**
         * Return the set of privileges that are parent privileges
         * 
         * @return
         */
            public static Set<AdminPrivilege> getParentPrivileges() {
                Set<AdminPrivilege> parents = new HashSet<AdminPrivilege>();
                for (AdminPrivilege priv : values()) {
                    if (priv.getParentPrivilege() == null) {
                        parents.add(priv);
                    }
                }
                return parents;
            }
    
        }
    
    }
    
    公共枚举AdminPrivilege实现java.io.Serializable{ //特权 管理_XX(“管理XX”,privilegegegegcategory.XX), 进口许可证(“进口许可证”,PrivilegeCategory.XX), 提交错误(“提交错误”,privilegegegegcategory.XX), 测试广告(“测试广告”,特权类别.XX), //管理员权限 登录(“登录到XX”,privilegegegcategory.ADMIN), MANAGE_ADMIN(“MANAGE Administrators”,privilegegegcategory.ADMIN), 管理角色(“管理角色”,privilegegegcategory.ADMIN), //任务特权 取消任务(“取消任务”,privilegegegcategory.TASK); 私有静态最终长serialVersionUID=1L; /** *定义特权类别。 * */ public enum privilegegegegcategory实现java.io.Serializable{ XX(“XX”), 管理员(“管理员”), 任务(“任务”); 私有静态最终长serialVersionUID=2L; 私有字符串显示值; //GWT序列化需要此构造函数 私有特权类别(){ } 私有特权类别(字符串显示值){ this.displayValue=displayValue; } @凌驾 公共字符串toString(){ 返回显示值; } } 私有字符串显示值; 私人管理特权; 私人特权类别私人特权类别; //GWT序列化需要此构造函数 私有管理员权限(){ } private AdminPrivilege(字符串显示值、PrivilegeCategory类别){ this.displayValue=displayValue; this.privilegegegegegegegegory=类别; } private AdminPrivilege(字符串显示值、PrivilegeCategory类别、AdminPrivilege父级){ 这(显示值、类别); this.parentPrivilege=parent; } /** *返回此权限的父权限。 * *@返回 */ 公共AdminPrivilege getParentPrivilege(){ 回归父母特权; } /** *返回此权限的类别。 * *@返回 */ public PrivilegeCegory GetPrivilegeCegory(){ 返回特权类别; } /** *返回类别集。 * *@返回 */ 公共静态集GetPrivilegeCegories(){ Set category=new HashSet(); 对于(PrivilegeCegory:PrivilegeCegory.values()){ 类别.增加(c); } 退货类别; } /** *返回类别的权限集。 * *@返回 */ 公共静态设置getPrivileges(PrivilegeCategory类别){ Set privileges=new HashSet(); 对于(AdminPrivilege p:AdminPrivilege.values()){ if(category.equals(p.getPrivilegeCategory())){ 特权。添加(p); } } 返回特权; } /** *返回特定特权的子特权集 * *@param父级 *@返回 */ 公共静态设置getChildPrivileges(AdminPrivilege父级){ Set children=newhashset(); 对于(AdminPrivilege priv:values()){ if(parent.equals(priv.getParentPrivilege())){ 添加(priv); } } 返回儿童; } /** *返回属于父级权限的权限集 * *@返回 */ 公共静态集getParentPrivileges(){ Set parents=new HashSet(); 对于(AdminPrivilege priv:values()){ if(priv.getParentPrivilege()==null){ 添加(priv); } } 返回父母; } } }
    您是否在枚举中指定了参数化构造函数?如果您有,并且它有参数,那么您也需要记住添加一个无参数构造函数,即使您不使用它,因为GWT将需要它。添加参数化构造函数而忘记添加无参数构造函数每次都会让我感到困惑,至少对于非枚举类来说是这样。

    这真的很奇怪。默认情况下,简单枚举应该是可序列化的,不需要任何更改。发布你的枚举代码。好吧-它不是一个简单的枚举-它有一个嵌入的枚举。这就是:在GWT2.3.0下,这个确切的枚举对我来说很好-更多代码上下文?@MarioP-对不起,我添加了使用IsSerializable的版本(这对我也适用)。我正在尝试使用java.io.Serializable使其正常工作。我已经修改了我的帖子来纠正这一点。@PeterD-我的评论保持不变。工作场所