2012-05-22 65 views
1

我正在學習GWT。GWT序列化問題,同時做RPC

我得到了關於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。 和其他條件p.getValues()返回List。

in 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 = [email protected] 
     at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619) 

我不想改變它字符串。我只想接收Object。導致此對象可能會有一些時間Stringdate,int

Plzz幫助。

回答

1

您應該閱讀有關RPC序列化的GWT文檔here

java.lang.Object類是不可序列化的,因此您不能期望跨線程序列化一組對象類型。

這就是爲什麼你會得到你的例外。在你給出的代碼中,你沒有使用字段值。你的類的兩個構造函數只設置值列表。所以,如果你不使用字段值,只需刪除它,它會工作。但假設這是一個錯誤,你需要使用它...

你將不得不知道你的價值可能有所有不同的可能類型。然後,要麼你有不同的領域,如intValue,dateValue,stringValue ... 或者你可以有一個字符串字段,並序列化你的對象像這樣的字符串。

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

}

0

在GWT中,聲明容器時從不聲明類似List的泛型類型。
請始終使用更具體的類型,如ArrayList

+0

:謝謝你的建議,我會這樣做。但那不是我的問題。我正在傳遞一個對象在構造函數中,我是gettin serializablity錯誤。如何刪除而不將其更改爲字符串或任何其他數據類型。 – NewCodeLearner

+0

在gwt的服務器端,你可以使用任何你需要的類型gwt沒有問題。但在客戶端,您可以通過instanceof keyward檢查可能的類型,永遠不會有問題。 – GingerHead

0

在你的情況,這個問題是最有可能的List<?>。 GWT並不知道你在這個列表中放置了什麼類型,所以它不會生成代碼來序列化源路徑上的每一種可能的類型,除了知道它已經需要的東西外,它不會產生任何東西。當你嘗試在其他地方不需要的地方放置某些東西時,就會發生異常,表明GWT沒有被告知你計劃通過電線發送該對象。

這裏的標準方法通常是創建一個標記界面,該標記界面可能實現了Serializable,並使其成爲List<MyModelObjects>。然後,每個可以放在那裏的對象都應該實現這個接口。