Partage
  • Partager sur Facebook
  • Partager sur Twitter

ObjectOutputStream modifier l'objet écrit

Sujet résolu
    5 juin 2017 à 21:47:41

    Bonjour,

    j'ai le même problème avec les flux de socket. Quand je sérialise deux fois le même objet, si il y a eu une modification de cet objet entre temps il sera réécrit comme à sa première écriture.

    Comment remédier à ce problème sans cloner l'objet pour changer sa référence avant de l'écrire ? Je ne veut pas utiliser cette technique parce que c'est lourd. Voici le code de l'exemple.

    package fr;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    
    public class Main
    {
    	public static void main(String[] args)
    	{
    		ecrire();
    		lire();
    	}
    	
    	public static void write(ObjectOutputStream out) throws IOException
    	{
    		ArrayList<String> list = new ArrayList<String>();
    		list.add("oui");
    		out.writeObject(list);
    		list.add("non");
    		out.writeObject(list);
    	}
    
    	public static void read(ObjectInputStream in) throws ClassNotFoundException, IOException
    	{
    		Object lecture;
    		lecture = in.readObject();
    		System.out.println(lecture);
    		lecture = in.readObject();
    		System.out.println(lecture);
    	}
    
    	public static void ecrire()
    	{
    		ObjectOutputStream out = null;
    		
    		try
    		{
    			out = new ObjectOutputStream(new FileOutputStream("save"));
    			write(out);
    		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    		}
    		finally
    		{
    			try
    			{
    				out.close();
    			}
    			catch (IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public static void lire()
    	{
    		ObjectInputStream in = null;
    		
    		try
    		{
    			in = new ObjectInputStream(new FileInputStream("save"));
    			read(in);
    		}
    		catch (IOException | ClassNotFoundException e)
    		{
    			e.printStackTrace();
    		}
    		finally
    		{
    			try
    			{
    				in.close();
    			}
    			catch (IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}
    }


    renvoie

    [oui]
    [oui]


    et devrais renvoyer

    [oui]
    [oui, non]



    -
    Edité par WatashiGaKita 5 juin 2017 à 21:50:26

    • Partager sur Facebook
    • Partager sur Twitter
      6 juin 2017 à 1:50:13

      Salut :)

      Il suffit de reset ton ObjectOutputStream entre les deux écritures ;)

      list.add("oui");
      out.writeObject(list);
      out.reset();
      list.add("non");
      out.writeObject(list);



      • Partager sur Facebook
      • Partager sur Twitter
        6 juin 2017 à 6:21:16

        Bonjour,

        As-tu essayé avec une collection synchronisée ?

        List<String> list = Collections.synchronizedList(new ArrayList<>());

        Quand on utilise des sockets ou des threads, il faut toujours penser à la synchronisation.

        • Partager sur Facebook
        • Partager sur Twitter
          6 juin 2017 à 16:16:17

          @QuentinPolet c'était effectivement ça merci beaucoup ça marche !

          @brubru777 ici ce n'est pas nécessaire, dans le code de l'exemple il n'y avais pas de thread.

          • Partager sur Facebook
          • Partager sur Twitter
            18 novembre 2017 à 10:50:02

            implements  interface Synchronized
            • Partager sur Facebook
            • Partager sur Twitter

            ObjectOutputStream modifier l'objet écrit

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown