2011-05-29 120 views
0

我正在編寫一個序列化其他模塊的模塊,並且我已經得到了所有工作,但我不確定如何反序列化多維數組。Java需要幫助反序列化多維數組

的問題是,我需要反序列化這樣的事情(還有其他一些屬性爲每個節點,如對象SUID,我已經排除爲了簡單起見。)

<var object="[[I"> 
    <_0 object="[I"> 
     <_0 object="java.lang.Integer">1</_0> 
     <_1 object="java.lang.Integer">2</_1> 
    </_0> 
    <_1 object="[I"> 
     <_0 object="java.lang.Integer">3</_0> 
     <_1 object="java.lang.Integer">4</_1> 
    </_1> 
</var> 

凡「對象「屬性描述了它是什麼對象。如果它是一個原始類型的數組,它將以一個包含[括號的數組開始,其中每個表示一個深度計數。即:

type int[][] = [[I 

type int[] = [i 

問題是我不知道如何編程創建一個深度爲x的數組?也就是說,如果我有我的方式去做的話,大概是這樣的:

switch(iArrayDepth) 
{ 
    case 1: 
     return new ArrayList<Integer>(); 
    case 2: 
     return new ArrayList<ArrayList<Integer>>(); 
    case 3: 
     return new ArrayList<ArrayList<ArrayList<Integer>>>(); 
etc... 
} 

必須有這樣做的更好的辦法:另一個問題是小號

,當我需要拆箱這個數組和使其成爲原始類型的多維數組。

回答

0

ArrayList不是一個數組。泛型在運行時會進行類型擦除,所以您在運行時嘗試使用的開關是沒有意義的。

如果您想創建一個List,只需創建一個沒有泛型的List即可。如果你想創建一個特定類型的數組,你可以使用數組。

Object array = Arrays.newArray(arrayType, arrayDepth); 

我會重新考慮你的文件格式。其詳細的數據你傳達的數量。

怎麼像

int[[ 2 
1,2 
3,4 

這傳達了一個更爲緊湊的格式相同的信息。

0

您可以使用Array.newInstance(Class, int...)在編譯時創建其類型和維度未知的數組。例如,下面創建一個3×4×5數組int

Object array = Array.instance(Integer.CLASS, 3, 4, 5); 

Object array = Array.instance(Integer.CLASS, new int[]{3, 4, 5}); 

這解決你問題的第二部分也是如此。