Avatar billede Slettet bruger
07. november 2003 - 15:32 Der er 8 kommentarer og
1 løsning

Send objekter med RMI

Jeg har en server der kører RMI og en classfileserver til dynamisk stub loading. Alt kører fint - indtil jeg begynder at arbejde med at sende egne objekter fra serveren til klienten.
Jeg ville mene klienten kun skal have interfacet til det objekt serveren instantierer, men jeg får en ClassNotFoundException på objektets implementeringsklasse.

Eksempel:
Klienten kalder: server.getObject() (returntype: Object)
Serveren instantierer ObjectImpl og returnerer det.

Exception på klient:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: ObjectImpl

Jeg kan se at klienten prøver at hente ObjectImpl klassen dynamisk fra serveren, og det virker hvis jeg giver den filen via classfileserveren, men i tilfælde hvor man ikke har dynamisk loading af klasser bruger man jo netop interfaces for at undgå komplikationer hvis man ønsker at ændre i koden (da interfaces jo meget sjældent ændres).

Har jeg ret i det burde kunne lade sig gøre uden at give klienten implementeringsklassen, eller er jeg kommet helt på afveje?
Avatar billede arne_v Ekspert
07. november 2003 - 15:49 #1
Nej. Ja.

Den kan ikke deserialisere uden at have den eksakte klasse.
Avatar billede Slettet bruger
07. november 2003 - 15:55 #2
Ok, det begynder så at gå op for mig, men jeg troede at det var en af fordelene ved at bruge RMI - at man ikke behøver andet end interfaces på klient-siden...

Problemet er ikke så stort - jeg kan blot tilbyde klassen via den dynamiske stub loader, og så har jeg stadig den dynamiske implementering af objektet. Det betyder dog også at der er nem adgang til serverens kildekode. Ikke at objektet indeholder sårbar kode, men det kunne det lige så godt have.

Kan du følge mig?
Avatar billede Slettet bruger
07. november 2003 - 15:56 #3
Andre kommentarer er velkomne!
Avatar billede arne_v Ekspert
07. november 2003 - 16:14 #4
Client koden bruger kun interfacet d.v.s. at client skal ikke ændres fordi
du ændrer implementationen.

Hvilket er godt.

Men en serialisering/deserialisering må jo i sagens natur involvere ikke
kun de public members/methods fra interfacet men også de private som
er en del af implementationen.

Derfor skal man kende klassen på runtime.
Avatar billede Slettet bruger
08. november 2003 - 11:21 #5
Det er lidt noget sludder at sige klienten kun bruger interfacet, hvis den skal kende implementationen (runtime eller ej).
Og igen troede jeg RMI kunne love mig at jeg ikke havde behov for at opdatere klienterne når server-koden ændres... I guess not. Tak for svar.
Kommentarer er stadig velkomne - jeg synes det er et interessant issue ...?
Avatar billede arne_v Ekspert
08. november 2003 - 11:30 #6
Når jeg siger at client kun bruger interfacet så mener jeg at du skal ikke
ændre i client source koden eller gencompile client koden. Det eneste
der kræves er at classloaderen på runtime kan finde klassen. Og som
du jo har fundet ud af kan det ske over nettet.
Avatar billede Slettet bruger
08. november 2003 - 11:33 #7
Helt rigtigt - det burde bare ikke være nødvendigt at skrive en webserver til at overføre koden dynamisk - og så er det da en sikkerhedsrisiko for din kildekode hvis den er sårbar ...
Avatar billede arne_v Ekspert
08. november 2003 - 16:18 #8
Tja. Men sådan er det.

Har du læst:
  http://java.sun.com/j2se/1.4.2/docs/guide/rmi/codebase.html
?
Avatar billede Slettet bruger
08. november 2003 - 18:41 #9
Ja, det har jeg. Det er også via codebase property'en man implementerer dynamisk classloading på klienterne.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester