【问题标题】:Java need help Deserializing multidimensional arrayJava需要帮助 反序列化多维数组
【发布时间】:2011-05-29 07:15:58
【问题描述】:

我正在编写一个序列化其他模块的模块,但我已经完成了所有工作,只是我不确定应该如何反序列化多维数组。

问题是,我需要反序列化这样的东西(为简单起见,我已经排除了每个节点的其他属性,例如对象 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...
}

一定有更好的方法:S

当我需要拆箱这个数组并使其成为原始类型的多维数组时,会出现另一个问题。

【问题讨论】:

    标签: java arrays serialization


    【解决方案1】:

    ArrayList 不是数组。泛型在运行时具有类型擦除功能,因此您尝试使用开关进行的操作在运行时毫无意义。

    如果您想创建一个列表,只需在没有泛型的情况下创建它。

    List list = new ArraysList();
    

    如果你想创建一个特定类型的数组,你可以使用数组。

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

    我会重新考虑您的文件格式。对于您要传达的数据量,它很冗长。

    怎么样

    int[[ 2
    1,2
    3,4
    

    这以更紧凑的格式传达相同的信息。

    【讨论】:

      【解决方案2】:

      您可以使用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});
      

      这也解决了您问题的第二部分。

      【讨论】:

        猜你喜欢
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多