Avatar billede wizzcat Nybegynder
28. november 2002 - 18:05 Der er 19 kommentarer

Classloading

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?.
Avatar billede arne_v Ekspert
28. november 2002 - 18:25 #1
Du skal sikre dig at du bruger din egen classloader, når
du forsøger at hente den serialiserede klasse.
Avatar billede arne_v Ekspert
28. november 2002 - 18:27 #2
Der er en Class forName som tillader dig at angive
classloader.
Avatar billede arne_v Ekspert
28. november 2002 - 18:27 #3
Forbehold: jeg har aldrig selv prøvet dette.
Avatar billede wizzcat Nybegynder
28. november 2002 - 18:29 #4
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.
Avatar billede disky Nybegynder
28. november 2002 - 18:33 #5
jeg ved ikke om man kan, men har du prøvet og lave en ClassLoading over netværket ?

problemmet er jo at den der forsøger at læse dit serialiserede objekt ikke kender klassen, og derfor fejler det.

Ellers må du lade alle eventuelle klienter kende alle typer af klasser de eventuelt kan modtage objekter fra.
Avatar billede arne_v Ekspert
28. november 2002 - 18:36 #6
Så din class loader virker og du kan loade en
class fil og instatiere et nyt objekt af typen.

Men du har brug for at kunne få unserialiseringen
af dit serialiserede objekt til at bruge din class
loader så den kender din klasse ?
Avatar billede wizzcat Nybegynder
28. november 2002 - 19:04 #7
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 :)
Avatar billede wizzcat Nybegynder
28. november 2002 - 19:06 #8
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 ;) )
Avatar billede arne_v Ekspert
28. november 2002 - 19:19 #9
Det er jo en interessant opgave.

:-)

Men heller ikke ligetil.

:-(

Den klasse der deserialiserer - har du prøvet at loade
den med din egen classloader ?

(min hypotese er at den vil bruge sin egen classloader
i.f.m. det serialiserede object der skal loades)
Avatar billede wizzcat Nybegynder
28. november 2002 - 20:09 #10
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.
Avatar billede arne_v Ekspert
28. november 2002 - 20:18 #11
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.

Bare et gæt.
Avatar billede carstenknudsen Nybegynder
28. november 2002 - 20:44 #12
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")});
Avatar billede wizzcat Nybegynder
28. november 2002 - 21:11 #13
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 :(
Avatar billede wizzcat Nybegynder
28. november 2002 - 21:15 #14
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!
Avatar billede carstenknudsen Nybegynder
28. november 2002 - 21:19 #15
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.
Avatar billede carstenknudsen Nybegynder
28. november 2002 - 21:20 #16
Eller hvorfor ikke bare sende class objektet, det har
altid fat i når du har en instans?
Avatar billede carstenknudsen Nybegynder
28. november 2002 - 21:29 #17
Nej, det duer ikke.
Avatar billede wizzcat Nybegynder
28. november 2002 - 21:57 #18
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....(
Avatar billede Slettet bruger
05. maj 2004 - 15:07 #19
mon ikke det er ved at være lukketid her ????
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