2011-05-29 8 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... 
} 

それを行うためのより良い方法があるに違いありません:私はこの配列をUnboxのために必要がある場合S

別の問題が発生し、それをプリミティブ型の多次元配列にする。

答えて

0

ArrayListは配列ではありません。ジェネリックスは実行時にタイプ消去があるので、スイッチで何をしようとしているのかは実行時に無意味です。

リストを作成したい場合は、ジェネリックスなしで作成してください。

List list = new ArraysList(); 

特定の種類の配列を作成する場合は、配列を使用できます。

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

あなたのファイル形式を再考します。あなたが伝えているデータの量を冗長にします。

int[[ 2 
1,2 
3,4 

のようなものについてはこれをはるかにコンパクトな形式で同じ情報を伝える方法

0

Array.newInstance(Class, int...)を使用すると、コンパイル時に型と次元がわからない配列を作成できます。たとえば、次の例は、3 x 4 x 5の配列intを作成します。

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

または

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

これは、同様にあなたの質問の後半部分を解決します。