07. november 2003 - 15:32Der 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.
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?
Den kan ikke deserialisere uden at have den eksakte klasse.
Synes godt om
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.
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.
Synes godt om
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 ...?
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.
Synes godt om
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 ...
Ja, det har jeg. Det er også via codebase property'en man implementerer dynamisk classloading på klienterne.
Synes godt om
Ny brugerNybegynder
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.