0
votes

Sériatation de l'arraylist et d'Ajout d'une nouvelle arrayliste

Je peux sérialiser ArrayList pour la première course. Il stocke la flamberie des clients à la première fois lorsque le fichier data.ser code> est créé. L'autre fois qu'il n'affiche pas de nouvelle arrayliste de clients.

    public void serializeBank(ArrayList<Customer> newCustomers) {
        try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("data.ser", true))) {
            os.writeObject(newCustomers);
        } catch (IOException i) {
            i.getMessage();
        }
    }


0 commentaires

3 Réponses :


0
votes

Vous devez ajouter de nouveaux clients à la liste des stocks existants et réussir cette arrayliste mise à jour à la méthode de sérialisation.


1 commentaires

Mais de cette façon, il n'est pas ajouté au fichier sérialisé. Cela écrirait plutôt toutes les données.



0
votes

Vous devez ajouter vos nouveaux clients à la liste des stocks existants et transmettez-la à votre méthode


3 commentaires

Nous ne pouvons donc pas ajouter le fichier data.ser , pouvons-nous?


Ouais, mais avez-vous essayé de fermer le courant quand il complète?


C'est un essayer avec faire un redondant fermé.



0
votes

au début

Vous ne pouvez apporter aucune donnée au fichier à l'aide de différents ObjectOutPutStream s. Vous pouvez lire ces questions sur Stackoverflow Ajout à un ObjectOutPutStream et java.io.streamcorruptedexception: code de type invalide: AC pour comprendre pourquoi vous ne pouvez pas faire cela. Mais en bref, c'est parce que chaque nouveau ObjectOutputStream appendez-le dans le fichier qui le corrompre. Donc, vous devriez utiliser une autre instance d'objet ObjectOutPutStream pour écrire tous vos objets dans le fichier.

secondaire

Vous ne pouvez pas sérialiser plusieurs objets des objets et désérialiser comme un ArrayList objet. Parce que les données sérialisées de différents objets diffèrent beaucoup. Chaque données sérialisée contient des métadonnées sur le type d'objet sérialisé, les noms de champs, les types de champs E.T.C. ObjectOutPutStream marque la marque Démarrer et l'extrémité de chaque objet Serialized et le ObjectInputStream utilise ce marqueur pour savoir comment savoir désérialiser les objets. Cela signifie que si vous écrivez 2 objets sur ObjectOutputStream Votre ObjectInPhatStream lira que 2 objets distinctement.

donc , si vous souhaitez sérialiser plusieurs objets des objets , puis désérialisez-les comme un arraylist alors vous devez mettre en œuvre votre propre Logique de sérialisation / désérialisation.

Vous pouvez également ajouter un nouveau client à la liste , puis effacez tout le contenu du fichier et séralize arraylist dans ce fichier, mais Cela entraînera des problèmes de performance.


2 commentaires

Merci pour l'explication détaillée. Comment traiter le problème de la performance alors? Aucune suggestion?


Je pense que le mieux consiste à écrire votre logique de sérialisation personnalisée. Mise en œuvre dépend de nombreux facteurs.Pour une instance "Écrivez-vous d'autres données à ce fichier?" "Est-ce que cette liste est champ d'autres objets sérialisables et vous essayez réellement de sérialiser cela. Objet parent? ". Mais, comme exemple de solution, je peux suggérer à [1] étendre arraylist [2] redéfinir lishObject , WriteObject méthodes [3] Track nouvellement ajouté Objets CODE ArrayList .Aussi vous devriez penser à Supprimer client S -Qu'est-ce que leur arrivera?