在执行RPC时出现GWT序列化问题

时间:2012-05-22 16:11:31

标签: java gwt serialization gwt-rpc gwt2

我正在学习GWT。

我收到了关于serilizablity的错误。

breif描述我的问题

在课程Customproperties

package com.exp.shared;


import java.io.Serializable;
import java.util.List;

public class Customproperties implements Serializable  {

    private Object value;
    private List<?> values;
          // more variable

    public Customproperties() {
        // TODO Auto-generated constructor stub
    }

    public Customproperties(String propertyName, List<?>  object,
            String propertyType, boolean mulitiValued, String cardinality, Boolean required) {

        this.propertyName=propertyName;
        this.values=object;
                // more initialization
    }

    public Customproperties(String propertyName,  List<?> object, String propertyType,
            boolean multiValued) {
        this.propertyName=propertyName;
        this.values=object;
                // more initialization
    }

    public Object getValue() {
              return value;
    }
    public List<?> getValues() {
        return values;
    }
 }

在其中一个classImpl的服务器包中,我正在使用Customproperties的对象

      if (doc.getPropertyValue("cmis:objectTypeId").toString().equals("cmis:document")) {

    customproperty=new Customproperties(p.getDefinition().getDisplayName(), p.getValue(), p.getType().toString(),p.isMultiValued());
       }
else {
    customproperty=new Customproperties(p.getDefinition().getDisplayName(), p.getValues(), p.getType().toString(),p.isMultiValued(),value.getCardinality(),value.isRequired());
            }

如果condntion p.getValue()返回Object。 在in else条件下,p.getValues()返回List。

当我将CustomProperties class更改为object variable时,string中的

正常工作正常。

但是我不改变它会给我错误。

com.exp.shared.Customproperties' 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.exp.shared.Customproperties@1aa5344
        at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)

我不想改变它。我只是想收到对象。因为此对象可能有时Stringdateint

Plzz帮助。

3 个答案:

答案 0 :(得分:1)

您应该阅读有关RPC序列化here的GWT文档。

  

类java.lang.Object不可序列化,因此您不能指望对象类型的集合将通过网络进行序列化。

这就是你得到例外的原因。在您给出的代码中,您没有使用字段值。类上的两个构造函数仅设置值列表。因此,如果您没有使用字段值,只需将其删除即可。但假设这是一个错误,你确实需要使用它......

您必须了解您的价值可能具有的所有不同类型。然后要么你有不同的字段,比如intValue,dateValue,stringValue ...... 或者你可以有一个String字段,并将你的对象序列化为这样的字符串。

public class CustomProperties {
    private String value;
    private String type;

    private void setValue(Object value, String type) {
        if (value != null) {
            this.value = value.toString();
            this.type = type;
        }
    }

    private Object getValue() {
        if (value != null) {
            if ("int".equals(type)) return Integer.valueOf(value);
            elseif ("date".equals(type)) return // Parse date from value here
            elseif ("string".equals(type)) return (String) value;
            // other cases
        }
        return value;
    }

}

答案 1 :(得分:0)

在GWT中,当声明容器时,永远不会声明像List这样的泛型类型 始终使用更具体的类型,例如ArrayList

答案 2 :(得分:0)

在您的情况下,问题很可能是List<?>。 GWT不知道你在该列表中放置了哪些可能的类型,因此除了生成代码以序列化源路径上的每个可能类型之外,它不会产生任何东西,除了它知道它已经需要的东西。当你试图在那里放置一些其他地方不需要的东西时,会发生异常,表明GWT没有被告知你计划通过网络发送该对象。

此处的标准方法通常是创建可能实现Serializable的标记接口,并使其成为List<MyModelObjects>。然后,每个可以适应那里的对象都应该实现该接口。