Avatar billede zapzone Nybegynder
08. juni 2007 - 12:48 Der er 5 kommentarer og
1 løsning

RMI - By reference problem

Hej Eksperter!

Sidder her med et rmi problem.
Jeg har en klasse/remote interface PersonInterface som extends Remote, dette interface indeholer blot getter/setters for Person klassen. Person klassen implementerer så PersonInterface.

Derudover har jeg en PersonDAO som også extends Remote, denne klasse indeholder en opret, opdater og en slet metode, samt en udskrivPersonnavn() og en getPersoner() metode.

I min Server klasse implementerer jeg PersonDAO interfacet. I Server klassen opretter jeg også en ArrayList personer, et par personer og indsætter personerne i Arraylisten. Her implementeres så opret, opdater, slet og  udskrivPersonnavn() metoderne. udskrivPersonnavn() metoden returnerer blot navnet på den første person i listen, altså personer.get(0).getNavn(). getPersoner() returnerer blot arraylisten personer. Så langt så godt :)

I min Client klasse opretter jeg også en ArrayList tmpPersoner. Denne liste smider jeg så personerne fra listen fra serveren ind i, altså tmpPersoner = stub.getPersoner()

And here comes the kicker!
Jeg vil nu påvise at person listen fra serveren er foregået "by reference" altså at tmpPersoner blot indeholder en reference til den oprindelige person liste på serveren. Derfor gør jeg følgende:

tmpPersoner.get(0).setNavn("Jens")

Hvis tmpPersoner var en ren kopi af person listen fra serveren, ville vi nu have ændret navnet på den første person lokalt på client siden, men da vi har gang i "by reference" skulle navnet i listen på serversiden også gerne blive ændret

Jeg kører derfor stub.udskrivPersonnavn()

Denne metode udskriver som bekendt det første navn fra listen på server siden, som nu gerne skulle være "Jens" (Lad os bare antage at navnet oprindeligt var "Karl")

Og nu til problemet: Når jeg kører min klient får jeg følgende fejl:

error unmarshalling return; nested exception is:
  java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: rmi_byReference.Person

Det skal siges, at det samme eksempel virker fint "by copy" altså hvor der ændres i tmpPersoner på client siden og navnet i de to lister er forskellige...

Nogen der kan sige om jeg har overset noget... ?
Har prøvet på at forklare problemet så godt som muligt... :)
Avatar billede arne_v Ekspert
08. juni 2007 - 14:59 #1
Fejl beskeden er jo ret tydelig.

Klassen rmi_byReference.Person er ikke serializable (og kan derfor ikke sendes via RMI).
Avatar billede zapzone Nybegynder
09. juni 2007 - 16:47 #2
Det er nemlig det jeg ikke forstår... Sådan som jeg har forstået det, så er det kun når objektet sendes "by copy" at serializeable skal implementeres. Her er jeg igang med "by reference"
Avatar billede arne_v Ekspert
09. juni 2007 - 17:59 #3
Dit interface implementerer Remote og din implementation implementerer
dit interface men extender din implementation UnicastRemoteObject ?

(UnicastRemoteObject implementerer Serializable og derfor kommer det hele til
at hænge sammen)
Avatar billede arne_v Ekspert
09. juni 2007 - 17:59 #4
Ellers ville det gøre det lidt nemmere hvis vi så noget kode.
Avatar billede arne_v Ekspert
07. august 2007 - 22:40 #5
Kommet videre ?
Avatar billede zapzone Nybegynder
01. oktober 2007 - 10:39 #6
Fandt ingen løsning desværre, lukket.
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