2011-12-07 94 views
1

我目前正在研究一個大應用程序,並且發現了一些細節。可以將數組序列化並將其放入一個包中。然後把它放在一個意圖,並開始活動。但在接收端,我必須通過痛苦的2步程序來反序列化數組。在Android上反序列化陣列

 MyObj[] data = (MyObj[])bundle.getSerializable("key"); // doesn't work 

    Object[] temp = (Object[])bundle.getSerializable("key"); 
    MyObj[] data2 = (MyObj[])temp, // doesn't work 

    MyObj[] data3 = new MyObj[temp.length]; // does work 
    for(int i = 0; i < temp.length; i++) { 
      data3[i] = (MyObj)temp[i]; 
    } 

那是我必須經歷通過數組循環的原因是什麼?

+0

這是不是一個Android特定的一個一般的Java問題一。谷歌搜索「Java鑄造陣列」將爲您的問題提供答案。 Java根本不允許向下投射陣列。 –

+0

相關http://stackoverflow.com/questions/1115230/casting-object-array-to-integer-array-error – Gray

回答

6

問題是,如果你有一個Object的數組,你投的是一個數組MyObj,編譯器將不得不通過並驗證數組中每個項目的類,以允許演員爲MyObj[]。 Java語言設計者決定不這麼做,並強迫程序員寫出來。例如:

Object[] objs = new Object[] { "wow", 1L }; 
// this isn't allowed because the compiler would have to test each object itself 
String[] strings = (String[]) objs; 
// you wouldn't want an array access to throw the ClassCastException 
String foo = strings[1]; 

所以Java語言強制你自己做循環。

Object[] objs = new Object[] { "wow", 1L }; 
String[] strings = new String[objs.length]; 
for (int i = 0; i < objs.length; i++) { 
    // this can then throw a ClassCastException on this particular object 
    strings[i] = (String) objs[i]; 
} 

可以使用Arrays類(使用System.arraycopy()本地方法)來輕鬆地做到這一點:

MyObj[] data3 = Arrays.copyOf(temp, temp.length, MyObj[].class); 

參見:How to convert object array to string array in Java

0

您也可以使用JSON與它是非常非常容易序列化和反序列化一個數組,你不必在你的代碼醜陋的強制轉換:

Gson gson = new Gson(); 
int[] ints = {1, 2, 3, 4, 5}; 
String[] strings = {"abc", "def", "ghi"}; 

// Serialization 
gson.toJson(ints);  ==> prints [1,2,3,4,5] 
gson.toJson(strings); ==> prints ["abc", "def", "ghi"] 

// Deserialization 
int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); 

來自實例:https://sites.google.com/site/gson/gson-user-guide#TOC-Array-Examples

+0

我使用Gson已經爲服務器的json/rest通信,它比java de/serializing慢。所以我想我使用的是鑄件。 – schlingel