2011-10-22 51 views
1

我有以下类,它执行一些计算来填充它的静态数组。使用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函数时,数组似乎不能正确初始化。试图从阵列读取的值(这似乎是空的后负荷)

+0

你有没有考虑过使用嵌入式数据库,而不是去文件? :-) – corsiKa

回答

3

问题出在您的LoadFile方法中。 Java按值传递参数。在对象的情况下,传递“指针”的副本。 当你更新数组:

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

你没有更新Amount.values1阵列,而不是本地ARR变量指向一个新的数组。

你应该方法签名更改为:

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

而且相应地使用它。

+0

是的,你很对。谢谢 – Wozza

+0

虽然我有些困惑。因此,在原始代码中,'loadFile'函数的第一个参数将作为指针传入。该函数然后创建该指针的副本,并更新该副本以指向存储文件加载结果(即'in.readObject()')的不同区域的内存。发送给该函数的指针保持不变,仍然指向一个空数组。这是否正确 – Wozza

+1

Java中没有真正的指针。我猜想说引用是更正确的。你上面写的是正确的。原始数组变量永远不会被初始化,因此当您访问它时会得到NullPointerException。 – Erel

0

这可能是与你在你的Amount类实现readObjectwriteObject方法一个问题,当我得到空指针异常。一个全面的例子可以发现here

您也可以考虑使用XStream来保存/加载您的数据。它很容易使用,如图所示here