Bonjour chers collègues,
J'ai une classe de jardin dans laquelle je serai sérialisé et désériorialiser plusieurs objets de classe végétale. La sérialisation fonctionne mais la désérialisation ne fonctionne pas si vous souhaitez l'affecter à la variable d'appel dans la méthode statique Mein. P>
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();
3 Réponses :
Que diriez-vous de sérialiser la liste entière à la place? Il n'est pas nécessaire de sérialiser chaque objet individuel dans une liste.
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; }
@Nilsh Merci beaucoup Changement de travail: Public Liste
Il peut ne pas toujours être réalisable de désérialiser toute une liste d'objets (par exemple, en raison de problèmes de mémoire). Dans ce cas, essayez:
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream( filename))) { while (true) { MyObject o = (MyObject) in.readObject(); // Do something with the object } } catch (EOFException e) { return; }
Cela n'a pas fonctionné pour moi. Je reçois une erreur de corruption de flux. Voir Stackoverflow.com/questions/23889486/...
@Faizal doit modifier la création de la création de la sortie. Voir Stackoverflow.com/questions/1194656/...
C'est à cause de votre condition de temps. Vous allez lire depuis le flux malgré cela est déjà consommé.
Si vous les sérialisez dans une liste linéaire Array, vous pouvez le repousser dans une liste linéaire pour la désériorialisation - toutes les autres méthodes ont échoué pour moi:
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() } } }
Qu'entendez-vous par «ça ne fonctionne pas»? Le code compile-t-il? Avez-vous des erreurs au moment de l'exécution? Quelles erreurs obtenez-vous exactement?
Bonjour, quel est le problème exact que vous voyez? Que voulez-vous dire, il ne fonctionne pas si vous souhaitez l'affecter à appeler la variable de la méthode statique (principale)? Dans un débogueur, voyez-vous le tableau code> Construit correctement construit?
De plus, vous devez mettre vos appels de fermeture IO dans le bloc
enfin code>. Et aussi, vous n'avez pas besoin de votre
ArrayList dp = nouvelle arrayliste (); code>. Il suffit d'avoir
arraylist dp = jardin.desarilizeplant (); code> comme votre tableau est créé dans
#Deserializeplant code>
Pourquoi êtes-vous en boucle pendant que vous objectez! = NULL? Si vous envisagez d'écrire un NULL au flux pour signaler EOS, c'est redondant, et si vous vous attendez à lire une nulle sans écrire, vous vous trompez. Vous devriez plutôt attraper une eofException à la place.