0

我想給一個類的對象 - 孩子的發送的ArrayList的孩子到Android活動

ArrayList<ArrayList<Double>> 

到Android活動。這是我的課:

package cz.honza.backpropagation.network.trainingset; 

import java.io.Serializable; 
import java.util.ArrayList; 

import cz.honza.backpropagation.network.parser.Csv; 

public class TrainingLineBase extends ArrayList<ArrayList<Double>> implements TrainingLine, Serializable { 

    private static final long serialVersionUID = -2777317734401540881L; 

    @Override 
    public String getEditorType() { 
     return Csv.SIMPLE; 
    } 
} 

它實現Serializable,所以我可以簡單地使用用於啓動活動的Android意向

public Intent putExtra (String name, Serializable value) 

方法。然後我嘗試在活動的onCreate方法中讀回它

getIntent().getSerializableExtra(INTENT_EXTRA_DATA); 

看起來很簡單,但它不起作用。我沒有得到我的TrainingLineBase類的對象,我得到

ArrayList<ArrayList<Double>> 

這是它的繼承樹中的父項。它保持着與原始TrainingLineBase相同的數據。所以看起來序列化不太好。真實的數據被轉移,但類型不是。

這是Android中的錯誤還是我做錯了什麼?

更新:有一個相當簡單的方法來獲得工作解決方案。我可以將繼承權改爲所有權。 neww類被很好的序列化/反序列化:

public class TrainingLineBase implements TrainingLine, Serializable { 
    public ArrayList<ArrayList<Double>> mData; 
    // .... 
+0

您是否嘗試將其轉換爲TrainingLineBase,或者檢查 'getIntent()。getSerializableExtra(INTENT_EXTRA_DATA)instanceof TrainingLineBase'的結果? – GreyBeardedGeek 2015-03-08 22:24:41

+0

你怎麼把這些數據? – 2015-03-08 22:26:13

+0

Casting to TrainingLineBase會導致ClassCastException,因爲您無法將父項轉換爲子項。 – 2015-03-08 22:44:47

回答

1

我沒有直接回答你的問題,但我可以建議一個替代方案。

如在http://developer.android.com/reference/java/io/Serializable.html的Serializable接口的Android文檔底部推薦的那樣,將類的狀態編碼爲JSON可能比股票Java序列化更可取。

如果您想採用此路線,您可以使用GSON或類似的JSON庫將對象「序列化」爲一個字符串,並將結果放入Intent的StringExtra中。然後,要反序列化,從Intent獲取StringExtra,使用GSON反序列化JSON字符串。在使用GSON時,您可以指定您試圖反序列化的對象的類。