Removing Deserialization of Several Java Objects

hello dear colleagues

I have a Garden class in which I serialize and deserialize several Plant objects. Serialization works, but deserialization does not work if you want to assign it to the calling variable in the static mein method.

public void searilizePlant(ArrayList<Plant> _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) { } } 

deserializing code:

 public ArrayList<Plant> desearilizePlant() { ArrayList<Plant> plants = new ArrayList<Plant>(); 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; } 

My call code:

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

change
I got a null pointer exception
@NilsH's solution works great, thanks!

+6
source share
3 answers

How about serializing the entire list? There is no need to serialize every single object in the list.

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

If this does not solve your problem, send more detailed information about your error.

+16
source

It is not always possible to deserialize a whole list of objects (for example, due to memory problems). In this case, try:

  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(); 

Or using the Java SE 7 try-with-resources statement:

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

If you serialize it to a linear array list, you can return it back to the linear array list when you deserialize it - all other methods did not help me:

 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 probably open, so just do nothing } } } @SuppressWarnings("unchecked") public static ArrayList<Person> readFromFile(String fileName) { FileInputStream fi = null; ObjectInputStream os = null; ArrayList<Person> peopleList = null; try { fi = new FileInputStream(fileName); os = new ObjectInputStream(fi); peopleList = ((ArrayList<Person>)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 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<Person> peopleList = new ArrayList<Person>(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<Person>)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<Person> 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() } } } 
0
source

All Articles