RMI-przekazywanie obiektów.

0

Mam kłopot z poprawnym używaniem obiektów za pomocą mechanizmu RMI. W dużym skrócie: mam serwer i klienta. Serwer ma pewne atrybuty, które są moimi własnymi klasami, np:

public class Serwer extends UnicastRemoteObject implements InterfejsSerwera {
	
	private static final long serialVersionUID = 1L;
	
	public ArrayList<Produkt> WszystkieProdukty=null;
	public ArrayList<Zamowienie> ListaZamowien=null;
	public Uzytkownik user=null;

	@Override
	public Uzytkownik zwrocUzytkownika() throws RemoteException {
		// TODO Auto-generated method stub
		return this.user;
	}
 

Chciałbym teraz w klasie Klienta zrobić coś takiego:

Uzytkownik remoteUser=mojObiektSerwera.zwrocUzytkownika();
 

Dostaję jednak wysyp wyjątków. Wydaje mi się, że moja klasa Użytkownik musi być Serializowana, nie wiem jednak jak to zrobić. Zaimplementowanie Serializable nic nie daje. Co robię źle? Jak przekazywać obiekty za pomocą RMI?

0

Skoro Uzytkownik ma być obiektem remote to nie powinien być serializowalny tylko powinien być remote...

0

Ok, przepraszam za nie zamieszczenie błędów. Oto one:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.io.WriteAbortedException: writing aborted; java.io.NotSerializableE
xception: paczka.Uzytkownik
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:191)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Remo
teObjectInvocationHandler.java:194)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvo
cationHandler.java:148)
        at $Proxy0.zwrocUzytkownika(Unknown Source)
        at paczka.Klient.main(Klient.java:39)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializab
leException: paczka.Uzytkownik
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
        at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:324)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173)
        ... 4 more
Caused by: java.io.NotSerializableException: paczka.Uzytkownik
        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.UnicastServerRef.dispatch(UnicastServerRef.java:332)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at sun.rmi.transport.Transport$1.run(Transport.java:174)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:5
53)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTranspor
t.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport
.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:603)
        at java.lang.Thread.run(Thread.java:722)
 

Najśmieszniejsze, że po po odpaleniu Eclipsa wszystko działa o_0. Błędy powstają po usunięciu implementacji interfejsu Serializable z klasy Użytkownik. WTF?

0

No a jak sobie to wyobrażasz? Obiekt który przesyłasz przez RMI to musi być albo obiekt Remote albo obiekt Serializable. Nie da sie inaczej. Logiczne że skoro masz zwykłą klasę i usuniesz z niej implementacje Serializable to nie zadziała. Czego sie niby spodziewałeś? Nie da się programować metodą prób i błędów. Musisz ROZUMIEĆ co robisz!

0

Ok, to opiszę po kroku co robiłem, bo chyba troszkę niezasłużenie mi się dostaje :)

  1. Program bez implementacji Serializable wywalał rzeczone wyjątki.
  2. Wygooglowałem, że powodem tych wyjątków jest najprawdopodobniej brak interfejsu Serializable, więc go zaimplementowałem. Program jednak nadal walił te same wyjątki.
  3. Przyszedłem prosić o pomoc na forum :)
  4. Po ponownym odpaleniu Eclipsa(bez żadnych zmian w kodzie) w celu skopiowania błędów i wklejeniu ich na forum, ku mojemu zdziwieniu wszystko działało.

To właśnie wywołało moje zdziwienie.

1

Zapewne pomiędzy punktem 2 a 3 nie skompilowałeś programu ponownie i tyle. Ale wydaje mi się ze to co zrobiłeś nie rozwiazało twojego problemu. Bo zrobienie Użytkownika Serializable sprawia ze możesz go przesłać, ok, ale wszystkie metody i inne rzeczy wywołane na nim będą lokalne. To jest ok jeśli twoja klasa Użytkownik przechowuje tylko jakieś dane, ale jeśli ty chcesz zeby ona w jakiś sposób wykonywała akcje na serwerze to juz nie bardzo...

1 użytkowników online, w tym zalogowanych: 0, gości: 1