GWT和枚举的问题 [英] Problems with GWT and Enum

查看:86
本文介绍了GWT和枚举的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在GWT应用程序的客户端中有一个枚举,当我尝试运行它与序列化问题相关时,我收到异常。我做错了吗?我读到GWT支持的枚举,我使用的是最后一个版本。



枚举:

  public enum AnEnum实现Serializable {

ITEM_A(项目描述),ITEM_B(项目b描述);

private String description;

private AnEnum(String description){
this.description = description;
}

public String getDescription(){
return description;
}

public void setDescription(String description){
this.description = description;
}

}

异常:

 导致:java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
在java.lang.reflect.Method.invoke(未知来源)
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:742)
... 47更多
造成:com.google.gwt.user.client .rpc.SerializationException:类型'(...)。client。(...)。AnEnum'不包含在可以由SerializationPolicy序列化的类型集合中,或者它的Class对象无法加载。出于安全考虑,此类型不会被序列化:instance = ITEM_A
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)
at com .google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)
com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize( Collection_CustomFieldSerializerBase.java:43)
在com.google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36)
... 52更多


解决方案

添加IsSerializable界面,默认范围无参数构造函数,确保它在您的gwt.xml文件中的源代码中列出的路径之一。 < source path =client>



我真的认为第三个建议是问题;我记得以前有这个问题,这是因为我在源路径之外有一个dto。



你可以有多个源代码。

 < source path =common/> 
< source path =client/>

一种模式是将持久化对象直接放在com.mysite.common下,以及持久化项目的mashup通过com.mysite.common.dto的电汇转移,当然客户端的gui代码在客户端。

 包com.mysite.client; 

import java.io.Serializable;

import com.google.gwt.user.client.rpc.IsSerializable;

public enum AnEnum实现Serializable,IsSerializable {

ITEM_A(项目描述),ITEM_B(项目b描述);

private String description;

AnEnum(){
}

AnEnum(String description){
this.description = description;
}

public String getDescription(){
return description;
}

public void setDescription(String description){
this.description = description;
}

}


I have an enum in the client part of a GWT application and I am getting an exception when I try to run it that is related to serialization problems. Am I doing anything wrong? I read that enums are supported by GWT and I am using the last version.

The enum:

public enum AnEnum implements Serializable {

    ITEM_A("Item a description"), ITEM_B("Item b description");

    private String description;

    private AnEnum(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

The exception:

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:742)
    ... 47 more
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type '(...).client.(...).AnEnum' 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 = ITEM_A
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:43)
    at com.google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36)
    ... 52 more

解决方案

Add IsSerializable interface, a default scoped no-arg constructor, and make sure its in one of the paths listed in the source tags in your gwt.xml file. <source path="client">

I really think the third suggestion is the issue; I remember having this issue before and it was because I had a dto outside the source paths.

You can have multiple source tags.

<source path="common" />
<source path="client" />

One pattern is to put persisted objects directly under com.mysite.common, and mashups of persisted items that get transferred over the wire in com.mysite.common.dto, and of course the client gui code is in client.

package com.mysite.client;

import java.io.Serializable;

import com.google.gwt.user.client.rpc.IsSerializable;

public enum AnEnum implements Serializable, IsSerializable {

    ITEM_A("Item a description"), ITEM_B("Item b description");

    private String description;

    AnEnum() {
    }

    AnEnum(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

这篇关于GWT和枚举的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆