使用java序列化保存/加载对象数组

时间:2011-10-22 16:06:56

标签: java serialization file-io

我有以下类,它执行一些计算来填充其静态数组。

public class Amount implements Serializable{
      private static final long serialVersionUID = 8141477444408242243L;
      public static Amount values1[][] = new Amount[10][30];
      public static Amount values2[][] = new Amount[10][30];
      public static Amount values3[][] = new Amount[10][30];

      double highestValue;
      double highestAmount;
      double lowestAmount;
      double lowestValue;

      ...
}

由于计算需要20分钟左右,我希望将数组存储在文件中并在程序启动时加载值。我正在尝试使用java序列化方法并具有以下功能

public static void loadFile(Amount[][] arr, String filename){
    try {
        FileInputStream fis = new FileInputStream(filename);
        ObjectInputStream in = new ObjectInputStream(fis);
        arr = (Amount[][])in.readObject();
        in.close();
      }
      catch (Exception e) {
          System.out.println(e);
      }
}

public static void saveFile(Amount[][] arr, String filename){
     try {
         FileOutputStream fos = new FileOutputStream(filename);
         ObjectOutputStream out = new ObjectOutputStream(fos);
         out.writeObject(arr);
         out.flush();
         out.close();
      }
      catch (IOException e) {
          System.out.println(e); 
      }
}

我称之为saveFile(values1, "valueOneSaveFile");loadFile(values1, "valueOneSaveFile");

我已经运行了一次程序,将所有数组保存到各种文件中。文件已创建并且看起来大小正确。当我更改程序以调用loadFile函数时,数组似乎没有正确初始化。我试图从数组中读取一个值(加载后似乎是空的)

,我得到空指针异常

2 个答案:

答案 0 :(得分:3)

问题在于您的LoadFile方法。 Java按值传递参数。在对象的情况下,传递“指针”的副本。 更新阵列时:

arr = (Amount[][])in.readObject();

您没有更新Amount.values1数组,而是将本地arr变量指向新数组。

您应该将方法签名更改为:

public static Amount[][] loadFile(String filename)

并相应地使用它。

答案 1 :(得分:0)

您在readObject课程中实施的writeObjectAmount方法可能存在问题。可以找到一个综合示例here

您也可以考虑使用XStream来保存/加载数据。它非常易于使用,如here所示。