10
votes

RMI notserializEnceptException Bien que c'est un objet distant

J'écris une petite application de discussion basée sur RMI.

L'idée est la suivante: le client se regagne sur le serveur, et chaque fois que le serveur reçoit un message d'un client, il appuie ce message à tous les autres clients.

Mais je reçois une notarializableException Bien que, l'objet, je passe comme un paramètre de méthode implémente l'interface distante. P>

Voici quelques codes: (La partie problématique est le paramètre ce paramètre code> dans ceci.chatserv.registriereclient (this); code> (implémentation clientChat)) p>

"Interface (ClientChat): p> xxx pré>

(clientChat) implémentation: p> xxx pré>

(preverchat) interface p> xxx pré >

(ServerChat) Implémentation P>

java.rmi.MarshalException: error marshalling arguments; nested exception is: 
    java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:156)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at $Proxy0.registriereClient(Unknown Source)
    at de.XX.Chat.ChatClientImpl.<init>(ChatClientImpl.java:19)
    at de.XX.Client.main(Client.java:49)
Caused by: java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:151)
    ... 5 more


0 commentaires

3 Réponses :


1
votes

Ce que vous pouvez faire est de configurer un objet de rappel. Ceci est celui qui étend unicastremoteObject et lorsque vous passez ceci, cela devient un rappel.

http://www.cs.swan.ac.uk.uk /~csneal/internetetComputing/rmichat.html


La télécommande n'est pas sérialisable. Vous ne pouvez pas passer un objet proxy de cette façon. Même si vous le faites sérialisable, il enverrait un copier de l'objet qui existerait sur le serveur. La copie de l'objet sur le client ne serait pas appelée.

Pour votre "serveur" pour envoyer des messages à votre "client", vous devez créer un service sur le "client" pour en faire un serveur.

Vous pouvez constater que l'utilisation d'une solution de messagerie telle que JMS est mieux adaptée à cette prise. Un serveur JMS propose des sujets que vous pouvez publier et vous abonner. Un serveur JMS simple à utiliser est actif MQ.


3 commentaires

Donc, si je vous comprends bien, je ne peux pas passer un objet distant via un paramètre sur le serveur et laisser le serveur appeler d'autres méthodes sur cet objet réussi?


Vous pouvez, mais l'objet appelé sera sur le serveur. Vous ne pouvez pas avoir appeler le client du serveur de cette façon. Certains protocoles RPC soutiennent cela, mais je ne me suis pas souvenu qui (j'ai écrit un dans le passé;). Pour un serveur de discussion, JMS Thèmes est le moyen le plus simple de le faire.


Il n'est pas nécessaire de prolonger UnicastremoteObject : vous pouvez l'exporter manuellement.



16
votes

Les objets passés sous forme de paramètres ou de résultats de méthodes distantes doivent être soit:

  1. sérialisable (ou externalisable), ou

  2. exportés objets distants.

    Le vôtre n'est pas non plus. Cependant, car il implémente une interface distante, vous avez une intention (2). Les objets qui étendent UnicastremoteObject sont automatiquement exportés en construction. Les objets qui ne doivent pas être exportés explicitement, via UnicastremoteObject.exportObject () .


0 commentaires

1
votes

On dirait que vous avez peut-être oublié de "étendre UnicastremoteObject" sur les implémentations de l'interface: xxx

et xxx


0 commentaires