IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Swing et Rmi


Sujet :

Java

  1. #1
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut Swing et Rmi
    Bonjour à tous,
    je vais essayer d'expliquer mon code:

    J'ai un JPanel qui tourne en boucle et appel start.Display(Graphics2D g){ save.server(1099); }
    Ensuite j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class ServerUnicastRemote extends UnicastRemoteObject implements ServerRemote{
     
    	Game game;
     
    	public ServerUnicastRemote(Game game) throws RemoteException { super(); this.game = game; }
     
    	public Game getGame() { return game; }
    	public void setGame(Game game) { this.game = game; }
     
    	@Override
    	public void Display() throws RemoteException { game.Display(); }
     
     
    }
    ServerRemote "implements" Remote et Game c'est l'objet distant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Game{
     
    	Graphics2D g;
     
    	public Game(){}
    	public Game setG2D(Graphics2D g){ this.g = g; return this; }
    	public void Display() {
    		g.drawRect(10, 10, 10, 10);
    	}
     
    }
    Dans Save j'ai ça, mais c'est pas le problème, ce code là fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void server(int port) {
    		try {
    			LocateRegistry.createRegistry(port);
    			ServerUnicastRemote od = new ServerUnicastRemote(game);
     
    			String url = "rmi://" + InetAddress.getLocalHost().getHostAddress() + "/SSJEngine";
    			System.out.println("Enregistrement de l'objet avec l'url : " + url);
    			Naming.rebind(url, od);
     
    		} catch (Exception e){e.printStackTrace();}
    	}
     
    	public ServerRemote client(String ip) {
    		try {
    			ServerRemote stub = (ServerRemote) Naming.lookup("rmi://" + ip + "/SSJEngine");
    			return stub;
    		} catch (Exception e) {e.printStackTrace();}
    		return null;
    	}
    et dans
    Evidemment ça ne marche pas mais vous avez surement compris l'idée,
    Alors ma question est, "Pourquoi ça ne marche pas?" et "Comment je doit faire?"
    Merci de votre aide.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ton Graphics2D il sort d'où? Je ne suis pas sur d'avoir compris l'idée, tu veux que le client, qui appelle une méthode remote "Display" force quelquechose à s'afficher sur le serveur?

  3. #3
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Le Graphics2D il sort du JPanel qui tourne en boucle d'où j'appel Display(Graphics2D g) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    public class Main implements Kernel{
     
    	private Start s = new Start();
    	private Game game = new Game();
    	private Save save = new Save(game, "sauvegarde");
    	private Boolean espace = false;
    	private Boolean server = false;
    	private Boolean client = false;
     
     
    	public Main(){ s.start(this); }
    	public static void main(String[] args) { new Main(); }
     
    	@Override
    	public void Creation() {
     
     
    	}
     
    	@Override
    	public void Display(Graphics2D g) {
    		game.setG2D(g);
    		if(espace && client){ game.Display(); }
    	}
     
    	@Override
    	public void keyPressed(KeyEvent e) {
    		if(e.getKeyCode() == 10){ game.setX(0); }//ENTER
    		if(e.getKeyCode() == 83){ save.server(1099); server = true; }//s
    		if(e.getKeyCode() == 67){ save.client("192.168.0.17"); client = true; }//c
    		if(e.getKeyCode() == 32){ espace = !espace; }//ESPACE
    		System.out.println(e.getKeyCode());
    	}
     
    	@Override
    	public void keyReleased(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseClicked(MouseEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseEntered(MouseEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseExited(MouseEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mousePressed(MouseEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseReleased(MouseEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void mouseWheelMoved(MouseWheelEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    }
    Et oui c'est bien ça que je cherche à faire.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je n'ai toujours pas compris ce que ton programme essaie de faire, ce code est assez confus.


    C'est quoi pour toi un "JPanel qui tourne en boucle?". Et ton Graphics2D, tu le récupère comment et quand? Si tu le récupère à partir de panel.GetGraphics(), sahce que tu n'es autorisé à le faire que depuis le thread EDT durant son appel à paint(). Le reste du temps sa valeur est son comportement sont imprévisibles car les Graphics2D liés à l'écran sont recyclés.

  5. #5
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Le Graphics2D vient bien de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void paint(Graphics g){
    	super.paint(g);
    	Graphics2D gdd = (Graphics2D)g.create();
    	((Kernel) s.kernel).Display(gdd);
    	gdd.dispose();
    	s.panel.repaint();
    }
    Kernel c'est Main.
    Il n'y a pas de problème avant le Display de Main.
    Le code qui consiste à afficher un élément à l'écran fonctionne parfaitement.
    Le Server RMI marche aussi parfaitement, le problème c'est quand j'essaye de combiner les deux.
    Donc ce que j'ai fait , là, mais qui ne marche pas c'est que j'ai mis une méthode Display dans ServerRemote, ServerUnicastRemote et dans Game pour que du coup si le client appel cette methode, ce soit le server qui affiche quelque chose, ou l'inverse, ou les deux je sait pas.
    J'espère que tu comprendra mieux ce que je veux faire.
    Merci de ton aide.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Non toujours pas tu es occupé de demander à ton serveur d'écrire quelque chose sur l'écran de ton client? Ce n'est juste pas possible. On ne peux pas prendre l'écran ou la carte graphique et la sérializer dans le flux rmi pour qu'elle apparaisse de l'autre coté. Graphics2D est un objet local. Je ne comprends d'ailleurs pas pourquoi RMI ne te remballe pas d'exception en tentant de faire ça.

  7. #7
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Presque, ce que je veux faire c'est demander au client d'afficher un objet à l'écran avec ça propre variable Graphics2D et non pas demander de l'afficher avec celui du serveur. Et c'est ce que le code est censé faire avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Override
    public void Display(Graphics2D g) {
    	->game.setG2D(g);
    	if(espace && client){ game.Display(); }
    }
    Parce que le client comme le serveur exécutent ce code et donc donnent leurs propre Graphics2D à Game.

    Si je ne peux pas faire ce genre de choses, qu'est ce que je peux faire pour arriver à ce résultat (faire un serveur avec swing)?
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  8. #8
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Pas d'idées?
    J'utilise un Multi-Thread ou un serveur RMI ou autre?
    Si j'utilise RMI, je le fait de quel manière?
    Est-ce que je cherche un moyen de faire une fonction qui sera commune à tout les clients pour afficher un élément ou,
    est-ce que je fait un objet commun à tout les clients qui contient les éléments que chacun doit afficher? Ou autre...
    Comment, VOUS, professionnels, vous organisez votre code?
    Apprenez moi, SVP.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il y a plusieurs problèmes à ton code:

    d'abord tu fais du RMI dans le thread graphique. Hors le RMI implique le réseau, le réseau c'est lent, et pendant ce temps là le thread graphique est bloqué (plus de rafraichissment, plus de clics, rien). Tu dois faire tes appels RMI en dehors du Thread Graphique.
    Ensuite, tu va utiliser ton Graphics2D chez le client à un mauvais moment, moment où il a probablement déjà été recyclé. Donc au mieux il ne fera rien, au pire il ira mettre un caca n'importe où sur l'écran.
    Enfin, tu est occupé de mélanger allègrement logique business et logique d'affichage. Sépare tes éléments.
    Et pour clore, je crois que tu ne réalise pas que ce qui se dessine dans un Graphics2D est éphémère. Tu devrais conserver ce que le serveur t'envoie.

    Pour faire simple:


    Tu devrais avoir un objet de donnée. Le serveur RMI appelle une méthode du client, le client met à jour la donnée chez lui puis demande au composant graphique de se redessiner, via par exemple un système de listener, mais on peux imaginer autre chose. Le Graphics2D ne sort jamais de paint() et il n'approche pas du RMI.
    Ainsi, on peux imaginer une interface Game avec une méthode nouveauPion(joueur, x, y).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void nouveauPion(Joueur j, int x, int y);
    L'implémentation coté client rajoute le Pion dans une liste de Pion, puis appelle un repaint()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @override
    public void nouveauPion(Joueur j, int x, int y){
      addPion(new PionJoueur(j.getCouleur(),x,y));
      SwingUtilities.invokeLater(grilleDeJeu::repaint);
    }
    Et dans ta classe GrilleDeJeu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class GrilleDeJeu extends JPanel {
       public void paint(Graphics g){
           for (PionJoueur pion: game.getListeDePions()){
               dessiner(pion,g);
           }
       }
       private void dessiner(PionJoueur pion, Graphics g){
          //code de dessin ici
       }
    }
    coté serveur, la class GameServeur aurait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void ajouterPionJoueur(int numeroJoueur, int x, int y){
       Joueur j = getJoueur(numeroJoueur);
        if (positionAutorisee(j,x,y){
           for (Game client: getListClient()){
             client.nouveauPion(j,x,y); //appel RMI vers les clients
           }
        }
    }

  10. #10
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Ok, merci beaucoup, juste une petite précision.
    Comment je fait pour sortir RMI du Thread graphique?
    Si je veux pouvoir lancer le serveur depuis un bouton afficher à l'écran, comment je fait?
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Avec un SwingWorker, par exemple.
    http://rom.developpez.com//java-swingworker/

  12. #12
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    J'ai pas compris ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extends SwingWorker<Integer, String>
    C'est quoi l'utilité de <Integer, String>.
    C'est quoi la différence avec avec un Thread?
    Est-ce que ça marche avec un Thread?
    Est-ce que tu aime les pâtes?

    Je me suis rendu compte d'un truc, je faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    game.affichemoiuntruc();
    Game c'est l'objet distant, en fait il faut que j'utilise ServerRemote.
    En plus Game n'était même pas sérialisable.
    Du coup c'est corriger.

    Il se trouve que mon code me crache une nouvelle exception en plein visage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Caused by: java.io.NotSerializableException: java.util.HashMap$KeyIterator
    Ça vient de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Game implements Serializable{
     
    	private Map<Integer, Rectangle2D.Double> boite = new HashMap<Integer, Rectangle2D.Double>();
     
    	public void putBoite(Integer id, Rectangle2D.Double rect){ boite.put(id, rect); }
    	public Iterator<?> getIterator(){ Set<?> cles = boite.keySet(); return cles.iterator();}
    	public Map<Integer, Rectangle2D.Double> getBoite(){ return boite; }
     
    	public Game(){}
    }
    Il n'y aurait pas une astuce pour régler le problème?
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Pecose Voir le message
    Est-ce que tu aime les pâtes?
    Oui

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Pecose Voir le message
    J'ai pas compris ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extends SwingWorker<Integer, String>
    C'est quoi l'utilité de <Integer, String>.
    Integer: le type de retour de la méthode doInBackground, tu pourra l'utiliser par la suite dans done() pour mettre à jour l'interface graphique.
    String: le type de retour du résultat intermédiaire (on utilise ça pour les processus long de calcul type progress bar, on peux y mettre par exemple "50% terminé")

    Citation Envoyé par Pecose Voir le message
    C'est quoi la différence avec avec un Thread?
    Est-ce que ça marche avec un Thread?
    Dans ton cas tu peux faire un Thread à part puisque le traitement ne nécessite pas de retour vers l'interface

    Citation Envoyé par Pecose Voir le message
    Je me suis rendu compte d'un truc, je faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    game.affichemoiuntruc();
    Game c'est l'objet distant, en fait il faut que j'utilise ServerRemote.
    En plus Game n'était même pas sérialisable.
    Du coup c'est corriger.....
    Il n'y aurait pas une astuce pour régler le problème?
    Si Game a besoin d'être sérializable, c'est que Game n'est pas un objet serveur (au sens d'objet RMI) mais juste une valeur que tu passe d'une méthode à l'autre lors d'appels au serveur RMI. Java utilise la sérialisation pour faire une copie de l'objet d'un machine A vers une machine B, mais ça deviens de facto des objets différents. Il faut que tu distingue bien les méthodes distantes, exposées à travers une classe implémentant ServerRemote et les valeurs qui sont passées à ces méthodes (sérialisées donc passées par copie)

  15. #15
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Et pour ce qui est de l'exception avec le Hashmap?
    Je comprend pas très bien ce qu'il ce passe.
    Ça vient du fait que Hashmap n'est pas sérialisable?
    Est-ce qu'il n'y a pas moyen de le transformer en quelque chose qui soit accepté?
    J'ai besoin de travailler avec des Hashmap et des ArrayList, comment je fait pour transmettre tout ça?

    En XML avec JAXBContext?
    Ça pourrait marcher ou pas?
    Le problème étant que je sais comment faire un fichier XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Saver(String sf, Save s) throws JAXBException {
     
    	JAXBContext context = JAXBContext.newInstance(Save.class);
    	Marshaller marshaller = context.createMarshaller();
    	marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    	marshaller.marshal(s, new File(sf));
     
    }
    Mais si je veux juste les données je suppose que je doit utiliser un autre marshaller.marshal(); que celui là.
    Le problème c'est que j'y comprend rien, t'as pas une idée?
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il faudrait la stacktrace complete, mais en gros tu as dans ton Game quelque chose qui n'est pas serializable.

  17. #17
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    B'in oui! C'est le HashMap ou alors, le Rectangle2D.Double qu'il y a dedans.
    A ton avis?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Caused by: java.io.NotSerializableException: java.util.HashMap$KeyIterator
    	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    	at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:294)
    	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:333)
    	at sun.rmi.transport.Transport$1.run(Transport.java:200)
    	at sun.rmi.transport.Transport$1.run(Transport.java:197)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(TCPTransport.java:683)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at java.lang.Thread.run(Thread.java:745)
    Si c'est pas le HashMap, je suis sauver mais sinon, je fait comment?
    +" Même question que j'ai poser ce matin. "
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non ce n'est pas le hashmap, c'est un itérateur de type java.util.HashMap$KeyIterator qui pose problème. Tu n'appelerais pas une méthode remote en lui passant un iterateur par hasard?

  19. #19
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    En fait, c'est pas un paramètre qui pose problème, mais un return de la classe Game qui retourne un iterateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Iterator<?> getIterator(){ Set<?> cles = boite.keySet(); return cles.iterator();}
    Vu que l'Iterator n'est pas sérialisable ça provoque l'exception !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Nope, le processus de serialization d'objetOutputStream n'appelle pas les getters, il travaille avec les fields.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Swing]JTable- Dimensionner les colonnes
    Par loutfi dans le forum Composants
    Réponses: 12
    Dernier message: 01/07/2011, 08h50
  2. [Integration] du Callback entre Spring RMI et Swing
    Par arafat877 dans le forum Spring
    Réponses: 0
    Dernier message: 01/03/2011, 18h53
  3. [swing] probleme de memoire
    Par leBigouden dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/05/2003, 14h19
  4. [SWING]jTable + Focus
    Par chady dans le forum Composants
    Réponses: 5
    Dernier message: 27/02/2003, 14h51
  5. [SWING][FONT] choisir la police par défaut
    Par narmataru dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/02/2003, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo