Hvordan serialiserer man en klasse et sted i et netværk og loader den ind et andet sted i netværket hvor class filen ikke findes i forvejen.?
1. Jeg kan godt hente den serialiserede klasse men kan naturligvis ikke hente den uden en ClassNotFoundException.
2. Jeg kan også godt lave en ClassLoader, hente selve classe-filen og loade den ind. Jeg kan derefter også lave nye instancer af den, men... hvordan henter jeg min tidligere serialiserede klasse(1), jeg får samme exception hver gang som om Classloaderen ignorer det.
3. skal jeg brug en betemt classloader eller hvad sker der?.
Ja, det må du nu uddybe lidt, jeg bruge ganske rigtigt min egen ClassLoader til formålet og da jag kan instantiere nye instanser er der noget der virker. Det er jo bare ikke en ny jeg vil have.
til disky: ja jeg har prøvet og den der læser kender interfacet så det burde være godt nok om ikke andet kan han betragte det som Object, problemet er at JVM vil kende den konkretet klasse og dertil skal Class Objectet være loaded først og åbenbart et andet sted end jeg lige kan regne ud. Hele ideen er jo netop at alle ikke behøver kende de konkrete klasse på compiletime :)
til arne : Ja netop. altså en ny instans, men med den state der er indeholdt i det serialiserede object (og helst uden at lave min egen bytecode parser ;) )
Jeg er ikke helt men på hvad du mener arne, Jeg har extended ClassLoader og lavet min egen der så bruges til at loade den ind. Det virker som sagt også noget af vejen. Dvs jeg har hentet den fra Sun så jeg mistænker ikke at det er fordi den er forkert.
Jeg mener: - du et serialiseret objekt a af typen A - du har A.class filen - du har en class loader X som kan loade A - du har en klasse/objekt B/b som skal have loadet a
Mit forslag er at du loader B/b med X og ser om det gør at den kan finde A.
Jeg går ud fra at du har forsøgt med en class loader der forsøger at hente class filen over netværket? ClassLoader cl = new URLClassLoader(new URL[] {new URL("urltilclass")});
til arne: Det er unægteligt noget tricky. Hvis alle klassser skal loades med min egen classloader skal jeg med reflection have fat i constructoren da jeg ellers kun kan kalde defaultconstructoren (som de så skal have!) Det vil blive en stor belastning. Jeg har ikke prøvet, selvom det virker så kan jeg ikke bruge det i praksis :(
Til Carsten: Nej har ikke brugt den da det er et meget stramt peer to peer netwærk hvor jeg ikke kan have nogen central database over classer el. andet. de henter fra hinanden og jeg vil helst ikke køre en extra server på hver peer til classloading. Men igen det ville kun give en ny instans ikke en med den state der var på det gamle serialiserede object!
Hvis du loader klassen før du modtager der serialiserede objekt får du det objekt du forventer, ikke en ny instans. Kunne din protokol ikke indeholde at du først sender en streng med navnet på klassen (getClass().getName()) og dernæst sender du det serialiserede objekt? Ind imellem kunne du så loade klassen. Lidt besværligt, men det ville kunne virke. Jeg kigger lige om der skulle være en anden løsning.
Det er faktisk det der sker allerede, idet jeg cacher objectets bytecode på vejen ind instantierer det og ved en en ClassNotFoundException udleder jeg instansens Class navn henter der over nettet loader den ind og forsøger igen at instantiere fra cachen. Så det er prøvet....(
Synes godt om
Slettet bruger
05. maj 2004 - 15:07#19
mon ikke det er ved at være lukketid her ????
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.