# Problem mit Übertragung einer Klasse in RMI



## Chrisi3210 (6. Aug 2009)

Hallo Leute!

Ich habe ein weiteres Problem mit der RMI:

Ich bekomme folgende Fehlermeldung:

java.rmi.MarshalException: error marshalling arguments; nested exception is: 
	java.io.NotSerializableException: Math.matatyp
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
	at $Proxy0.seta(Unknown Source)
	at Math.imathclient.main(imathclient.java:41)
Caused by: java.io.NotSerializableException: Math.matatyp
	at java.ibjectOutputStream.writeObject0(Unknown Source)
	at java.ibjectOutputStream.writeObject(Unknown Source)
	at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
	... 5 more
Der RMIclient hat ein Problem mit der Übertragung des Inhaltes der Klasse matatyp.
Wo ist das Problem?


----------



## SlaterB (6. Aug 2009)

NotSerializableException erklärt alles oder läßt sich vollständig nachschlagen?


```
NotSerializableException
```

Serialisierung ist sicherlich auch ein Thema, was man dann mal im Lehrbuch nachschlagen sollte


----------



## Chrisi3210 (6. Aug 2009)

In meinen "Lehrbüchern" steht nicht drin, wie selbstdefierte Klassen zur Übertragung in der RMI serialisiert werden müssen.


----------



## tfa (6. Aug 2009)

Das Serialisieren übernimmt RMI, aber die Objekt bzw. deren Klassen müssen auch serialisierbar sein, d.h. java.io.Serializable implementieren.


----------



## Chrisi3210 (6. Aug 2009)

Und wie ? 
[Java]
Etwa class xy implements java.io.Serializable{
} 
[/code]
?


----------



## Chrisi3210 (6. Aug 2009)

Ui....
Jetzt funzt es. Danke!
;-)


----------



## tuxedo (7. Aug 2009)

Jepp, "Seriealizeable" ist einfach ein Marker-Interface... 

Bei SIMON ist es ähnlich. Da sollte jede Klasse "SimonRemote" implementieren und jedes zu transportierende Objekt mindestens "Serializeable". 

- Alex


----------



## tfa (7. Aug 2009)

tuxedo hat gesagt.:


> Jepp, "Seriealizeable" ist einfach ein Marker-Interface...
> 
> Bei SIMON ist es ähnlich. Da sollte jede Klasse "SimonRemote" implementieren


Und warum? Ist das wegen der Java 1.4-Kompatibilität oder warum benutzt du diese veraltete Technik?


----------



## tuxedo (7. Aug 2009)

Was soll an einem Interface verkehrt sein? Annotation würds zwar auch tun, aber die mag ich erstens nicht so und zweitens würde es diese eine eh schon simple Sache nicht weiter "verbessern". 

- Alex


----------



## tfa (8. Aug 2009)

Ein Interface definiert  (wie der Name schon sagt) eine Schnittstelle aus Methodenprototypen und stellt somit einen Typ dar. Bei einem bloßen Markerinterface ist der nicht der Fall. Meiner Meinung nach ist diese Praktik ein Missbrauch von Interfaces. Es passt halt nicht. Das kann man heute besser durch Annotationen lösen, die übrigens ziemlich praktisch sind (früher dachte ich auch "Was soll das"). 

So richtig falsch (im Sinne von gefährlich) sind diese Markierungsinterfaces natürlich auch nicht. Nur eben unschön. Kritischer finde ich da schon die SimonRemoteExceptions, die von allen Methoden deklariert werden müssen und die Abhängigkeit der Schnittstelle zur Implementierung so richtig festklopfen. Ich finde, wenn es schon eine Alternative zu RMI  gibt, sollte man es da gleich besser machen. Die Service-Schnittstelle sollte einfach nur ein POJI sein.


----------



## tuxedo (8. Aug 2009)

Ja, die Sache mit den Exceptions stört mich auch nch etwas. Steht aber auf meinem Plan für das nächste Major-Release. 

Auf der anderen Seite: Was gibts denn da für alternativen? Jeder Remote-Call kann ja in einer Exception enden. Eine Laufzeitexception? Naja. Da hatte ich schon mehrfach das Problem dass Leute damit nicht umgehen können. Mit der SimonRemoteException ist man nur gezwungen den Call mit einem Try/Catch zu versehen und ggf. auf Fehler zu reagieren.

Was mir so spontan einfällt: 

Die SimonRemoteException weglassen und einen ExceptionHandler anbieten: Der aufrufende muss vorher einen Listener registrieren der von Simon benachrichtigt wird wenn ein Call schief ging. Da kann dann auch drin stehen welcher Call das war und welche Argumente im Spiel waren. Der eigentliche Call liefert dann nur eine Runtime Exception. 
Auf der anderen Seite könnte es sein dass dadurch die Benutzung im Fehlerfall umständlicher wird. 

Andere Ideen?
Wobei... Ich könnte dafür auch nen extra Thread aufmachen damit es HIER nicht zu sehr offtopic wird.... (hier geht nun weiter: http://www.java-forum.org/netzwerkp...und-ohne-simonremoteexception.html#post544985)

- Alex


----------

