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



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

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函数时,数组似乎没有正确初始化。当试图从数组(加载后似乎为空)读取值时,我得到空指针异常

问题在于你的LoadFile方法。Java按值传递参数。在对象的情况下,传递"指针"的副本。当你更新数组时:

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

您没有更新金额。Values1数组,而不是局部的arr变量指向一个新的数组。

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

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

这可能是您在Amount类中实现的readObjectwriteObject方法的问题。一个全面的例子可以在这里找到。

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

最新更新