2013-04-22 4 views
6

привет уважаемые коллеги,Deserialize несколько объектов Java

У меня есть класс Garden, в котором я сериализую и десериализую несколько объектов класса Plant. Сериализация работает, но десериализация не работает, если требуется назначить ее вызывающей переменной в статическом методе mein.

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) { 
    } 
} 

десериализация код:

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; 
} 

Моего ссылающийся код:

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

редактировать
Я получил исключение нулевого указателя
Решения @NilsH работает нормально, благодаря!

+0

Что вы подразумеваете под словом «это не работает»? Содержит ли код? Вы получаете ошибки во время выполнения? Какие ошибки вы получаете точно? – Jesper

+0

Привет, какая именно проблема вы видите? Что вы имеете в виду, это «не работает, если вы хотите присвоить его вызывающей переменной в (основном) статическом методе»? В отладчике вы правильно строите массив 'plants'? – wmorrison365

+0

Кроме того, вам нужно отправить свои закрытые вызовы ввода-вывода в блок 'finally'. Кроме того, вам не нужен ваш 'ArrayList dp = new ArrayList ();'. Просто используйте 'ArrayList dp = garden.desearilizePlant();' поскольку ваш массив создан в '# deserializePlant' – wmorrison365

ответ

16

Как насчет сериализации всего списка? Нет необходимости сериализовывать каждый отдельный объект в списке.

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; 
} 

Если это не поможет решить вашу проблему, пожалуйста, разместите более подробную информацию о вашей ошибке.

+0

+1 Я бы пошел с этим ... – wmorrison365

+0

@NilsH спасибо, что он работает change: public ** Список ** deserializePlant() {....} – imalik8088

0

Возможно, не всегда возможно десериализовать весь список объектов (например, из-за проблем с памятью). В этом случае попробуйте:

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 (ObjectInputStream in = new ObjectInputStream(new FileInputStream(
      filename))) { 
     while (true) { 
      MyObject o = (MyObject) in.readObject(); 
      // Do something with the object 
     } 
    } catch (EOFException e) { 
     return; 
    } 
+0

Это не сработало для меня. Я получаю сообщение об ошибке «Поток коррупции». См. Http://stackoverflow.com/questions/23889486/java-io-streamcorruptedexception-wrong-format-when-reading-more-than-1-object – faizal

+0

@faizal Необходимо изменить способ создания выходного потока. См. Http://stackoverflow.com/questions/1194656/appending-to-an-objectoutputstream – Tomasz

+0

Его из-за вашего состояния. Вы будете читать из потока, несмотря на то, что он уже поглощен. –

0

Если вы сериализации его в линейный массив списка, вы можете привести его обратно в массив линейный список при десериализации - все другие методы не удались для меня:

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<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'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<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() 
     } 
    } 
} 
Смежные вопросы