05. april 2002 - 18:14Der 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?
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å.
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..).
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++)
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!!!
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.
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..
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.