1

Comment enregistrer une ArrayList dans un fichier? Qu'est-ce que je fais wro ng?Comment puis-je enregistrer une ArrayList <MyObject> dans un fichier?

J'ai utilisé cette question de manière à me aider avec des objets Serializable .:

how to serialize ArrayList on android

et moi cette question SO sur la façon d'écrire une liste de tableau:

Java - How Can I Write My ArrayList to a file, and Read (load) that file to the original ArrayList?

Cependant quand j'essaye d'écrire le dans le dossier j'obtiens l'erreur:

java.io.NotSerializableException: at

java.io.ObjectOutputStream.writeObject at

com.mycompany.MyClass.saveData

Voici MyClass qui tente d'enregistrer le fichier

private ArrayList <MyCustomObject> arrayList; 
private File dataFile; 
private String FILE_NAME = "FILE_DATA.dat"; 

public void init(final Context context) { 
    this.appContext = context; 

    dataFile = new File(appContext.getFilesDir(), FILE_NAME); 

    if (dataFile.exists()) { 
     loadData(); 

    } else { 

     try { 
      dataFile.createNewFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     arrayList = new ArrayList <MyCustomObject>(); 
saveData(); 
    } 

} 


private void saveData() { 
    FileOutputStream fos = null; 

    try { 
     fos = new FileOutputStream(dataFile); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } finally { 

     if (fos != null) { 

      ObjectOutputStream oos = null; 
      try { 

       oos = new ObjectOutputStream(fos); 

       if (oos != null) { 

        oos.writeObject(arrayList); 

       } 
       assert oos != null; 
       oos.close(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


} 

private void loadData() { 

    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(dataFile); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } finally { 

     if (fis != null) { 

      ObjectInputStream ois = null; 
      try { 
       ois = new ObjectInputStream(fis); 

       if (ois != null) { 

        try { 

         arrayList = (ArrayList <MyCustomObject>) ois.readObject(); 
        } catch (ClassNotFoundException e) { 
         e.printStackTrace(); 
        } 
       } else { 

       } 
       assert ois != null; 
       ois.close(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

est ici MyCustomObject

public class MyCustomObject implements Serializable { 

    public String myname = ""; 
    public String someOtherItem = ""; 
    public int aNumber = 0; 
    public MyCustomObject getCustomObject() { 
     return this; 
    } 
} 
+0

Qu'est-ce que vous essayez de serialise - la variable membre 'arrayList' d'une instance de 'MyClass', ou l'instance de' MyClass' elle-même? – clownba0t

+0

Je suppose que je devrais sérialiser mon ArrayList puisque c'est ce qui doit être sauvé. –

+0

En effet - 'MyClass' semble avoir un membre' Context' (voir 'this.appContext' dans la méthode' init') qui n'est certainement pas sérialisable _not_! – clownba0t

Répondre

1

Remplacer cette méthode

public MyCustomObject MyCustomObject() { 
     return this; 
} 

dans votre classe MyCustomObject et votre code devrait bien fonctionner. Utilisez quelque chose comme

public MyCustomObject getMyCustomObject() { 
     return this; 
} 

Parce que la façon dont vous nommez votre méthode est en conflit esprit le constructeur par défaut que Java crée pour la classe de MyCustomObject lorsque vous ne fournissez pas vous-même constructeur. Je suppose que vous utilisez cette méthode pour pouvoir ajouter une instance de MyCustomObject à votre liste de tableaux: vous n'avez pas vraiment besoin d'une telle méthode mais avec le bon nom, vous pouvez toujours l'utiliser.

Vous devez également mettre des exemples de données dans votre ArrayList avant de l'enregistrer sur le disque en appelant la méthode saveData().

Voici une illustration de votre code qui fonctionne. Je ne suis pas sûr de ce que votre objet Context est exactement mais vous l'utilisez pour accéder au chemin du fichier, donc pour faire avancer les choses, j'ai juste utilisé un chemin de fichier particulier.

public class MyClass { 
    private ArrayList <MyCustomObject> arrayList; 
    private File dataFile; 
    private String FILE_NAME = "FILE_DATA.dat"; 

    public void init(final Context context) { 


     dataFile = new File("C:\\lompo\\file1.txt"); 

     if (dataFile.exists()) { 
      loadData(); 

     } else { 

      try { 
       dataFile.createNewFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      arrayList = new ArrayList <MyCustomObject>(); 
      MyCustomObject obj1 = new MyCustomObject(); 
      obj1.aNumber = 125; 
      obj1.myname = "HIS NAME"; 
      arrayList.add(obj1); 
      saveData(); 
     } 

    } 

    public static void main(String[] args) { 
     MyClass myClazz = new MyClass(); 
     myClazz.init(null); 

     System.out.println("Arraylist has " + myClazz.arrayList.size() + " elements"); 
    } 

    private void saveData() { 
     FileOutputStream fos = null; 

     try { 
      fos = new FileOutputStream(dataFile); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 

      if (fos != null) { 

       ObjectOutputStream oos = null; 
       try { 

        oos = new ObjectOutputStream(fos); 

        if (oos != null) { 

         oos.writeObject(arrayList); 

        } 
        assert oos != null; 
        oos.close(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 


    } 

    private void loadData() { 

     FileInputStream fis = null; 
     try { 
      fis = new FileInputStream(dataFile); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 

      if (fis != null) { 

       ObjectInputStream ois = null; 
       try { 
        ois = new ObjectInputStream(fis); 

        if (ois != null) { 

         try { 

          arrayList = (ArrayList <MyCustomObject>) ois.readObject(); 
         } catch (ClassNotFoundException e) { 
          e.printStackTrace(); 
         } 
        } else { 

        } 
        assert ois != null; 
        ois.close(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 
} 

Comme vous pouvez le voir dans le code, la première course de la principale méthode va enregistrer le fichier sur le disque avec un arrayList peuplé d'un objet. Le second passage se lit à partir du fichier, puis j'ai imprimé le nombre d'éléments et les infos que j'ai enregistrées avant: l'image illustre le résultat

enter image description here

+0

Merci. Laissez-moi travailler en pensant cela avec vos suggestions et je reviendrai avec vous –

+0

@ user-44651 avez-vous essayé? Est-ce que ça marche pour toi? – alainlompo

+0

Non, je reçois toujours 'java.io.NotSerializableException: W/System.err: à java.io.ObjectOutputStream.writeNewObject' lors de l'enregistrement –