Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

RMI - ResultSet - java.io.NotSerializableException

15 views
Skip to first unread message

Thomas Jarnot

unread,
Mar 20, 2000, 3:00:00 AM3/20/00
to
verehrte java-gemeinde,

ich versuche schon eine zeit lang mir von einem rmi-server ein ResultSet,
dass das ergebnis einer jdbc-odbc-sql-abfrage beinhaltet, zurückgeben zu
lassen.
da RMI mit objekt-strömen arbeitet, muss alles was übers netz geht, die
schnittstelle Serializable implementieren, richtig?
da ResultSet selbst ein interface ist, kann ich das ja nicht direkt übers
netz schicken. also habe ich mir einen kleinen Wrapper gecodet, der
Serializable implementiert und als konstruktor-argument das ResultSet der
sql-abfrage mitkriegt:

public class myResultSet implements Serializable
{
ResultSet rs;

// Konstruktor
public myResultSet (ResultSet rs)
{
this.rs = rs;
}

public ResultSet getRS ()
{
return rs;
}
}

leider funktioniert dieser "trick" nicht so ganz. der client (auf linux) terminiert dabei mit folgendem statement:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.WriteAbortedException: Writing aborted by exception; java.io.NotSerializableException: sun.jdbc.odbc.JdbcOdbcResultSet

achja...
ich habe übrigens auch schon versucht, das ResultSet auf dem server zu lassen und dort mit eigenen methoden abzufragen, was aber leider auch ein griff ins klo war. die methode last () z. B. terminierte auf dem server mit einer "java.lang.UnsupportedOperationException"...was ich am wenigsten verstehe..???

ich nehme mal an, dass es keine frage des designs sondern der technik ist.
gibts es überhaupt die möglichkeit, ein ResultSet per RMI zu versenden? müssen alle objekte in einer serialisierbaren klasse ebenfalls serialisierbar sein?
wenn nicht, was gibt es konzeptionell für alternativen um das ergebnis einer
entfernten SQL-abfrage anzuzeigen außer z. b. mit string-arrays zu
arbeiten?

ich danke schonmal fürs lesen und hoffe, dass mir jemand weiterhelfen kann!

_mfg_,
t.homas ()


Frank Thomas Aßmann

unread,
Mar 21, 2000, 3:00:00 AM3/21/00
to
Hallo Thomas !

Thomas Jarnot schrieb:
>
> verehrte java-gemeinde,
> ...


> da RMI mit objekt-strömen arbeitet, muss alles was übers netz geht, die
> schnittstelle Serializable implementieren, richtig?

Ja.

> da ResultSet selbst ein interface ist, kann ich das ja nicht direkt übers
> netz schicken.

Dein ResultSet "ist" sicherlich kein Interface, sondern implementiert
ein Interface.
Dann wäre Dein Anfrageergebnis ein Objekt irgendeiner Klasse. Diese
Klasse solltest
Du serialisierbar machen.

> also habe ich mir einen kleinen Wrapper gecodet, der
> Serializable implementiert und als konstruktor-argument das ResultSet der
> sql-abfrage mitkriegt:
>
> public class myResultSet implements Serializable
> {
> ResultSet rs;
>
> // Konstruktor
> public myResultSet (ResultSet rs)
> {
> this.rs = rs;
> }
>
> public ResultSet getRS ()
> {
> return rs;
> }
> }

Was genau ein "ResultSet" ist, wäre hier auch interessant.



> ich nehme mal an, dass es keine frage des designs sondern der technik ist.
> gibts es überhaupt die möglichkeit, ein ResultSet per RMI zu versenden?

Jedes Objekt einer Klasse die "Serializable" implementiert, kann man per
RMI versenden.

> müssen alle objekte in einer serialisierbaren klasse ebenfalls serialisierbar sein?

Wenn Du Sie versenden willst : Ja.
Ob das allgemein gilt ? Ich glaube nein, aber in "Java I/0 von Elliotte
Rusty Harold"
sollte es drinstehen.

> wenn nicht, was gibt es konzeptionell für alternativen um das ergebnis einer
> entfernten SQL-abfrage anzuzeigen außer z. b. mit string-arrays zu
> arbeiten?

siehe oben


> ich danke schonmal fürs lesen und hoffe, dass mir jemand weiterhelfen kann!

> _mfg_,
> t.homas ()

Gruß,
Frank Thomas Aßmann

Thomas Jarnot

unread,
Mar 21, 2000, 3:00:00 AM3/21/00
to
danke für Deine antwort!

ich bin aber in der zwischenzeit zu folgender lösung gekommen:

1.
für eine übertragung durch einen objektstrom müssen selbst alle
memberklassen einer klasse serialisierbar sein, weil die serialiserung der
masterklasse an die members delegiert wird.

2.
ein ResultSet (java.sql.ResultSet) ist def. nicht versendbar, was natürliche
eine kleine änderung im design erfordert. ich habe im remote-interface jetzt
methoden implementiert, die dem client gewisse datenbank-zugriffe anbieten
und die ergebnisse durch einen vektor (=serialisierbar) zurücksendet.

btw:
ich habe von einem corba-guru erfahren, dass es dort genauso gemacht wird
und das das einzig wahre ist.... (kein eigenlob!)

naja...hauptsache es rennt jetzt!

greetingz!
t.homas ();

Frank Thomas Aßmann <frank-thom...@dzsh.landsh.de> schrieb in im
Newsbeitrag: 38D77BF6...@dzsh.landsh.de...

0 new messages