Avatar billede martinhrj Nybegynder
05. april 2002 - 18:14 Der er 9 kommentarer og
1 løsning

Sende objecter over sockets...

Hejsa.

Når jeg sender et object fra client til server gennem sockets, så ændrer i variablerne på clientsiden og sender objectet igen, ændrer variablerne sig ikke på serversiden.
Men hvis jeg sender et object og så opretter et nyt object med de nye variabler på clienten og sender det, bliver det opdateret på serversiden.

Kan det være rigtigt, eller skal jeg gennemlæse min kode for 25 gang?
Avatar billede soreno Praktikant
05. april 2002 - 18:49 #1
hvorfor bruger du ikke rmi, når nu du arbejder med objekter ?
Avatar billede greybeard Nybegynder
05. april 2002 - 19:04 #2
Det er en "feature" i java.
Du skal ikke gennemlæse din kode mere.
Avatar billede soreno Praktikant
05. april 2002 - 22:07 #3
greybeard> kunne du ikke uddybe denne "feature" ?
Avatar billede greybeard Nybegynder
06. april 2002 - 03:36 #4
Jeg kan kun sige at det er et kendt problem, som ingen, jeg har snakket med, kan give en fornuftig forklaring på.
Løsningen er at lave en copy constructor, så det er nemt at lave et nyt objekt, som er magen til det gamle, og så rette det til.
Medmindre man skal ændre meget selvfølgelig. Så er det måske mere rationelt at starte helt fra bunden.
Iøvrigt er det vel mange gange at skyde lidt over målet, at bruge RMI.
I mange tilfælde er en objectStream bare en nem måde at sende forskellige datatyper på.
Avatar billede martinhrj Nybegynder
06. april 2002 - 09:03 #5
Jeg siger tusind tak!
Og jeg bruger ikke RMI da opgaven (jeg er datamatikerstuderende) siger at vi skal bruge Sockets.
Avatar billede soreno Praktikant
06. april 2002 - 10:08 #6
ahhh, selvfølgelig, man skal jo bare bruge interfacet "Clonable" og så lave en kopi når objektet sendes:

send(IP:PORT, mitObj.clone());

Problemet er at objekter oprettet med "new" ligger på heapen, og i java arbejder vi normalt kun med referencer. Altså når et objekt der er lavet på serveren sendes, sendes kun referencen til objektet, og det kan klienten jo ikke bruge til ret meget. Derfor brug clone();

Forresten er det dit ansvar som programmør at sørge for at Clonable er implementeret i dine klasser, ligesom man selv skal holde styr på copy constructoren i c++ (hvis man arbejder med pointere..).
Avatar billede soreno Praktikant
06. april 2002 - 10:10 #7
jeg glemte lige at skrive at problemet kun forekommer når "mitObj" selv har oprettet objekter med "new", altså ikke med primitive datatyper (igen, ligesom copy constructor fra c++)
Avatar billede martinhrj Nybegynder
06. april 2002 - 10:24 #8
Det lyder som noget brugbart! Jeg siger tak hvis det virker! (selvom jeg lige har fået det til at virke ved at lave en "copy-klasse"). Pure fabrication er et fedt begreb!!!

Jeg prøver...
Avatar billede greybeard Nybegynder
06. april 2002 - 11:47 #9
Med mindre det er en generisk løsning, er C++ løsningen med en konstruktor, der tager et object af samme type som parameter en udmærket løning.
MyObj obj1 = new MyObj();
MyObj obj2 = new MyObj(obj1);

Pas på med aggregerede klasser. Det skal nok være en deep copy for at virke.
Avatar billede soreno Praktikant
06. april 2002 - 12:02 #10
java.util.LinkedList laver en shallow copy
java.util.Vector laver en deep copy
så man skal nok være opmærksom hvis man bruger clone() (kig i dokumentationen).

Clonable er javas svar på copy constructor, og bruges i vid udstrækning i klasse hierarkiet. Derfor synes jeg man bør følge samme praksis. Men hvis man vil, kan man jo bare lave en copy constructor..
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