Partage
  • Partager sur Facebook
  • Partager sur Twitter

RMI ArrayList vs String

Sujet résolu
    21 septembre 2021 à 4:52:57

    Bonjour.

    J'explore la technologie rmi en java (remote methode invokation)

    Mais voila j'ai un soucis... pas de problème pour passer une string, mais de petit soucis pour passer un arraylist :

    public class RMIEndPoint extends UnicastRemoteObject implements RemoteOptions {
    
    	private static final long serialVersionUID = 1L;
    	
    	SimpleTextSocket serverSocket;
    
    	public RMIEndPoint(SimpleTextSocket serverSocket) throws RemoteException {
    		super();
    		this.serverSocket = serverSocket;
    	}
    
    	@Override
    	public ArrayList<clientData> getClient() throws RemoteException {
    		System.out.println("is trying to contact");
    		return serverSocket.getClientList();
    	}
    
    	@Override
    	public String contact() throws RemoteException {
    		// TODO Auto-generated method stub
    		return "HelloWorld";
    	}
    
    }

    De ce que j'ai compris (je ne suis pas sur), il faut que les objets soient sérializable. Sauf que je sais pas trop comment m'en débrouiller avec mon arraylist.

    Est-ce que je doit créer moi même une classe : ArraySerializable extends ArrayList implement Serializable ? C'est lourd un peu :s
    Est-ce que le problème vient bien du fait que mon arraylist n'implemente pas sérializable ?

    Pour plus de précision les erreurs (qui apparaissent après la fermeture de l'ui) :

    rmi://127.0.0.1/RMIEndPoint
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.BufferedReader
    	at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:197)
    	at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:217)
    	at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:162)
    	at jdk.proxy3/jdk.proxy3.$Proxy7.getClient(Unknown Source)
    	at org.openjfx.chatClient/org.openjfx.chatClient.menu.windows.clientListControler.initialize(clientListControler.java:30)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    	at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
    	at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    	at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
    	at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
    	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2591)
    	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
    	at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
    	at org.openjfx.chatClient/org.openjfx.chatClient.menu.MainMenuControler.clientList(MainMenuControler.java:58)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    	at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
    	at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    	at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
    	at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
    	at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1784)
    	at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670)
    	at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    	at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    	at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    	at javafx.controls/javafx.scene.control.MenuItem.fire(MenuItem.java:459)
    	at javafx.controls/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1380)
    	at javafx.controls/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.lambda$createChildren$12(ContextMenuContent.java:1333)
    	at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    	at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    	at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    	at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    	at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    	at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3862)
    	at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
    	at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2590)
    	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
    	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
    	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
    	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
    	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
    	at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    	at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    	at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    	at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
    	at java.base/java.lang.Thread.run(Thread.java:831)
    Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.BufferedReader
    	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1696)
    	at java.base/java.io.ObjectInputStream$FieldValues.<init>(ObjectInputStream.java:2554)


    Etc etc

    • Partager sur Facebook
    • Partager sur Twitter

    "Etre vrai, peu le peuvent."
    Friedrich Nietzsche

      21 septembre 2021 à 14:06:14

      Bonjour,

      Normalement, la classe ArrayList est Serializable. Mais peut-être pas ClientData, par contre
      • Partager sur Facebook
      • Partager sur Twitter
        21 septembre 2021 à 14:56:43

        Hello :)

        Dommage ca aurait été trop simple.

        Ma classe ClientData est serializable. C'est chiant que les erreur ne disent pas de quel classe vien le problème.

        Est-ce que ca viendrait de l'objet bufferReader de la classe ClientData ?

        "java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
            java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.BufferedReader"

        package beans;
        
        import java.io.BufferedReader;
        import java.io.PrintWriter;
        import java.io.Serializable;
        import java.net.Socket;
        
        public class clientData implements Serializable {
        
        	private static final long serialVersionUID = 1L;
        	Socket socket;
        	PrintWriter out;
        	BufferedReader in;
        	String pseudo;
        	
        	public clientData(Socket socket, PrintWriter out, BufferedReader in) {
        		this.socket = socket;
        		this.out = out;
        		this.in = in;
        	}
        
        	public String getPseudo() {
        		return pseudo;
        	}
        
        	public void setPseudo(String pseudoString) {
        		this.pseudo = pseudoString;
        	}
        
        	public Socket getSocket() {
        		return socket;
        	}
        
        	public void setSocket(Socket socket) {
        		this.socket = socket;
        	}
        
        
        	public PrintWriter getOut() {
        		return out;
        	}
        
        	public void setOut(PrintWriter out) {
        		this.out = out;
        	}
        
        	public BufferedReader getIn() {
        		return in;
        	}
        
        	public void setIn(BufferedReader in) {
        		this.in = in;
        	}
        }



        -
        Edité par -Crixus- 21 septembre 2021 à 15:03:12

        • Partager sur Facebook
        • Partager sur Twitter

        "Etre vrai, peu le peuvent."
        Friedrich Nietzsche

          21 septembre 2021 à 15:44:57

          Adrien Supra a écrit:

          C'est chiant que les erreur ne disent pas de quel classe vien le problème.

          Est-ce que ca viendrait de l'objet bufferReader de la classe ClientData ?

          "java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
              java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.BufferedReader"


          Ben du coup les erreurs indiquent bel et bien quelle classe cause le problème.

          Cela dit, il mentionne BufferedReader parce que c'est le premier sur lequel il tombe. Ca marche pas mieux avec Socket ni avec PrintWriter.

          Avant de penser à corriger le problème, on peut raisonnablement se demander à quoi tu pensais en essayant de transférer ce genre d'objet par RMI. Ca n'a aucun sens. Donc en gros, pour corriger, il faudrait revenir à la raison et ne pas essayer de faire des choses comme ça.

          • Partager sur Facebook
          • Partager sur Twitter
            21 septembre 2021 à 16:14:09

            xD

            C'est vrai, ca n'a aucun sens. Mais j'oserai m'expliquer !

            Cette classe est a l'origine coté server d'un chat. Je voulais lister les clients aux clients sous la forme <ip><pseudo>. Sans réfléchir je me suis dit... bah ya qu'a transférer l'array d'information client.

            Mais oui transférer une socket ca n'a aucun sens. Et si cela était possible d'ailleur ca poserai des problèmes de sécurité. Cela dit c'est super chiant dans mon cas de recreer une structure juste pour le transfère.

            Edit : Avec un array d'objet de type string pseudo, string ip ca fonctionne :)

            -
            Edité par -Crixus- 21 septembre 2021 à 16:38:10

            • Partager sur Facebook
            • Partager sur Twitter

            "Etre vrai, peu le peuvent."
            Friedrich Nietzsche

            RMI ArrayList vs String

            × 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