反序列化多个Java对象

亲爱的同事们,

我有一个Garden类,我在其中序列化和反序列化多个Plant类对象。 序列化工作正在进行,但是如果要在mein静态方法中将其分配给调用变量,则反序列化不起作用。

public void searilizePlant(ArrayList _plants) { try { FileOutputStream fileOut = new FileOutputStream(fileName); ObjectOutputStream out = new ObjectOutputStream(fileOut); for (int i = 0; i < _plants.size(); i++) { out.writeObject(_plants.get(i)); } out.close(); fileOut.close(); } catch (IOException ex) { } } 

反序列化代码:

 public ArrayList desearilizePlant() { ArrayList plants = new ArrayList(); Plant _plant = null; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); Object object = in.readObject(); // _plant = (Plant) object; // TODO: ITERATE OVER THE WHOLE STREAM while (object != null) { plants.add((Plant) object); object = in.readObject(); } in.close(); } catch (IOException i) { return null; } catch (ClassNotFoundException c) { System.out.println("Employee class not found"); return null; } return plants; } 

我的调用代码:

 ArrayList plants = new ArrayList(); plants.add(plant1); Garden garden = new Garden(); garden.searilizePlant(plants); // THIS IS THE PROBLEM HERE ArrayList dp = new ArrayList(); dp = garden.desearilizePlant(); 

编辑
我得到了一个空指针exception
@NilsH的解决方案工作正常,谢谢!

如何序列化整个列表呢? 无需序列化列表中的每个单独对象。

 public void searilizePlant(ArrayList _plants) { try { FileOutputStream fileOut = new FileOutputStream(fileName); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(_plants); out.close(); fileOut.close(); } catch (IOException ex) { } } public List deserializePlant() { List plants = null; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); plants = in.readObject(); in.close(); } catch(Exception e) {} return plants; } 

如果这不能解决您的问题,请发布有关您的错误的更多详细信息。

反序列化整个对象列表(例如,由于内存问题)可能并不总是可行的。 在那种情况下尝试:

  ObjectInputStream in = new ObjectInputStream(new FileInputStream( filename)); while (true) { try { MyObject o = (MyObject) in.readObject(); // Do something with the object } catch (EOFException e) { break; } } in.close(); 

或者使用Java SE 7 try-with-resources语句:

  try (ObjectInputStream in = new ObjectInputStream(new FileInputStream( filename))) { while (true) { MyObject o = (MyObject) in.readObject(); // Do something with the object } } catch (EOFException e) { return; } 

如果将序列化为数组线性列表,则可以在反序列化时将其强制转换为数组线性列表 – 所有其他方法对我来说都失败了:

 import java.io.*; import java.util.ArrayList; import java.util.Arrays; public class Program { public static void writeToFile(String fileName, Object obj, Boolean appendToFile) throws Exception { FileOutputStream fs = null; ObjectOutputStream os = null; try { fs = new FileOutputStream(fileName); os = new ObjectOutputStream(fs); //ObjectOutputStream.writeObject(object) inherently writes binary os.writeObject(obj); //this does not use .toString() & if you did, the read in would fail } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } finally { try { os.close(); fs.close(); } catch(Exception e) { //if this fails, it's probably open, so just do nothing } } } @SuppressWarnings("unchecked") public static ArrayList readFromFile(String fileName) { FileInputStream fi = null; ObjectInputStream os = null; ArrayList peopleList = null; try { fi = new FileInputStream(fileName); os = new ObjectInputStream(fi); peopleList = ((ArrayList)os.readObject()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch(EOFException e) { e.printStackTrace(); } catch(ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } finally { try { os.close(); fi.close(); } catch(Exception e) { //if this fails, it's probably open, so just do nothing } } return peopleList; } public static void main(String[] args) { Person[] people = { new Person(1, 39, "Coleson"), new Person(2, 37, "May") }; ArrayList peopleList = new ArrayList(Arrays.asList(people)); System.out.println("Trying to write serializable object array: "); for(Person p : people) { System.out.println(p); } System.out.println(" to binary file"); try { //writeToFile("output.bin", people, false); //serializes to file either way writeToFile("output.bin", peopleList, false); //but only successfully read back in using single cast } // peopleList = (ArrayList)os.readObject(); // Person[] people = (Person[])os.readObject(); did not work // trying to read one at a time did not work either (not even the 1st object) catch (Exception e) { e.printStackTrace(); } System.out.println("\r\n"); System.out.println("Trying to read object from file. "); ArrayList foundPeople = null; try { foundPeople = readFromFile("input.bin"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if (foundPeople == null) { System.out.println("got null, hummm..."); } else { System.out.println("found: "); for(int i = 0; i < foundPeople.size(); i++) { System.out.println(foundPeople.get(i)); } //System.out.println(foundPeople); //implicitly calls .toString() } } }