/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Serialisering/clone spørgsmål
Fra : Mads Orbesen Troest


Dato : 26-05-03 01:35

Hej;

Jeg har lige brugt timer på et problem med, at ændringer i et hashtable i
en serializable klasse, der via en ObjectOutput stream blev sendt til en
klient via en TCP socket, tilsynelade ikke blev modtaget af klienten.

Klienten modtog disse requests således:
   IResponse rsp = (IResponse)aSockIn.readObject();

Den serialiserbare klasse indholdt (bl.a.) en vektor af hashtables, der
blev tilføjet til vektoren således:
   vec.add( ( (CSession)sml.nextElement() ).getProfile().getCriteriaMap() );
Uden at gå i detaljer returnerer getCriteriaMap() en reference til det
hashtable, der skal indgå i response-pakken.

OK det for mig lettere mystiske er så, at når det hashtable
getCriteriaMap() returnerer er blevet modificeret og jeg i en debugger
kunne se, at det VAR de nye værdier der var i hashtablet lige før det blev
sendt som en del af response-klassen over ObjectOutputStream'en, så var det
stadig det gamle hashtable der blev modtaget på klienten. Som desperationen
satte ind prøvede jeg til sidst (efter mistanke om, at det havde noget med
referencer at gøre) at sende en clone af response objektet afsted istedet:
   vec.add( ( (CSession)sml.nextElement()
).getProfile().getCriteriaMap().clone() );

Og, jamen, så virkede det jo pludselig... Det jeg så gerne vil høre er,
hvad der egentlig foregår her. ;) Er det noget med, at fordi det er samme
instans af hashtablet jeg serialiserer igen, så mener klienten at den
allerede HAR en reference til den instans, og dermed bruger de gamle
værdier, selv om der er sket ændringer i objektets tilstand der, hvor jeg
serialiserer det? Kan den godt se, at det er samme instans (via et
hemmeligt objekt-ID eller sådan noget)?

Nå, men det var da også en måde at bruge en aften på... ;)
/\/\\ads Orbesen Troest

 
 
Lars Dam (26-05-2003)
Kommentar
Fra : Lars Dam


Dato : 26-05-03 06:24

On Mon, 26 May 2003 02:34:44 +0200
Mads Orbesen Troest <mads@troest.NEVERMORE.dk> wrote:

> Hej;
> OK det for mig lettere mystiske er så, at når det hashtable
> getCriteriaMap() returnerer er blevet modificeret og jeg i en debugger
> kunne se, at det VAR de nye værdier der var i hashtablet lige før det blev
> sendt som en del af response-klassen over ObjectOutputStream'en, så var det
>

Det er egentligt simpelt nok hvis du tænker over det. Det er sikkert fordi du har send dit objekt een gang tidligere... Så sørger Serializable mekanismen for at det ikke bliver gensendt. Du kan læse om dette hvis du dykker ned i Serializable dokumentatationen.

Hvis du kigger nærmere på ObjectOutputStream, så kan du se følgende som du måske kan bruge:

enableReplaceObject();

Alternativt at lukke objectoutputstreamen, og genåbne den.

> /\/\\ads Orbesen Troest

vh. ld

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste