1

我正在学习 GWT。

我收到了关于 serilizablity 的错误。

我的问题的简要描述

在类 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());
            }

如果条件 p.getValue() 返回 Object。并且在其他条件下 p.getValues() 返回列表。

CustomProperties class当我改变它时object variablestring它工作得很好。

但我不改变它它给了我错误。

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)

我不想改变它 String 。我只想接收对象。导致此对象有时可能是String, date, int.

请帮忙。

4

3 回答 3

1

You should read the GWT docs about RPC serialization here.

The class java.lang.Object is not serializable, therefore you cannot expect that a collection of Object types will be serialized across the wire.

This is why you get your exception. In the code you've given, you're not using the field value. Both constructors on your class only set the values list. So if you're not using the field value, just remove it and it will work. But assuming that's a mistake and you do need to use it ...

You will have to know all the different possible types your value can have. And then either you have different fields, like intValue, dateValue, stringValue ... Or you can have one String field, and serialize your objects into strings like this.

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;
    }

}

于 2012-05-22T16:45:26.170 回答
0

在 GWT 中,声明容器时从不声明像List.
始终使用更具体的类型,例如ArrayList.

于 2012-05-22T16:19:40.970 回答
0

In your case, the problem is most likely the List<?>. GWT doesnt know what possible types you are putting in that list, so instead of generating code to serialize every single possible type on the sourcepath, it generates nothing except for what it knows it already needs. When you attempt to put something in there that wasn't needed elsewhere, the exception occurs, indicating that GWT wasn't told that you planned on sending that object over the wire.

A standard approach here is usually to create a marker interface that probably implements Serializable, and make it a List<MyModelObjects>. Then every object that can fit in there should implement that interface.

于 2012-05-22T17:21:42.330 回答