Avatar billede hankster Nybegynder
14. december 2001 - 01:30 Der er 14 kommentarer og
2 løsninger

Serializable

hej

Jeg har fundet ud af at hvis objekter skal gemmes på en fil, så SKAL de implementere interfacet Serializable.

Er der en som kan forklare mig hvorfor, eller hvad meningen med Serializable egentlig er?

ps. har læst hjælpen på java.sun.com, men er ikke helt med.
Avatar billede powerbart Nybegynder
14. december 2001 - 01:56 #1
Det betyder blot at det kan skrives til disken eller sendes over et netværk, eller lign.

Når en klasse er serializable, betyder det også at alle det variable skal være serializable. Ved mindre at du skriver:
public transient MyObj myObj;
istedet
public MyObj myObj;

Så vil dette ikke blive serialiseret, og behøver derfor ikke at implementere serializable - interfacet.

Svar nok ?

Der er ingen ben i det.

Avatar billede powerbart Nybegynder
14. december 2001 - 01:58 #2
Eksempel:

class Test {
  public transient String name;
  public transient String id;
}
Avatar billede powerbart Nybegynder
14. december 2001 - 01:58 #3
Nej jeg mener:

class Test {
  public transient String name;
  public String id;
}
Avatar billede powerbart Nybegynder
14. december 2001 - 01:59 #4
Nej jeg mener

import java.io.*;
class Test implements Serializable {
  public transient String name;
  public String id;
}


Så vil name ikke blive gemt, men id vil blive gemt.
Avatar billede greybeard Nybegynder
14. december 2001 - 02:03 #5
Serializable bruges over netværk som checksum.
Den lokale klasse og remoteklassen skulle gerne være ens.
Avatar billede hankster Nybegynder
14. december 2001 - 02:36 #6
som checksum.. for at sikre at det indhold som blev skrevet ned på en fil er det samme indhold som kommer op når den læses fra igen?

er det rigtigt forstået?
Avatar billede hankster Nybegynder
14. december 2001 - 02:42 #7
--powerbart

Det er sådan set ikke et spørgsmål om BRUGEN af Serializable, men mere et spørgsmål der går på MENINGEN med interfacet.

eftersom man ikke skal implementere nogle metoder i interfacet, så er det bare lidt uforståeligt hvorfor man som programmør absolut skal lave ens klasser være serializable. Hvad siger man dermed? og hvilke klasser vil man f.eks. ikke kunne lave serializable?
Avatar billede hankster Nybegynder
14. december 2001 - 02:43 #8
for hvorfor skulle man ikke lade alt være serializable?
Avatar billede jakoba Nybegynder
14. december 2001 - 03:01 #9
med implements Serializable fortæller du at objekter af den klassen skal kunne konverteres til en bitstreng.

I klassen bliver det så automatisk genereret en funktion til at gøre det, og en anden til at konvertere den bitstreng tilbage til et Java-objekt.

dvs at klassen indeholder 2 ekstra (og pænt store) metoder, plus sandsynligvis en del formatterings information der ellers kunne skippes.

så en serialisable klasse vil fylde mere og måske endda også køre langsommere.

mvh JakobA
Avatar billede greybeard Nybegynder
14. december 2001 - 03:01 #10
Checksum: Over Netværk. Når to programmer udveksler objekter.
Den ene måde at gøre det på kræver at Klassen findes i begge ender af forbindelsen.
Hvis de to klasser ikke er ens for man en EXception baseret på forskellige serienumre.
Avatar billede logical Nybegynder
14. december 2001 - 08:40 #11
Serializable er et såkaldt marker interface, det bruges for at kunne lave instanceof Serializable på et objekt og få enten true eller false. Dette bruges af f.eks. en ObjectOutputStream til at tillade at et givent objekt bliver serialiseret. ObjectOutputStream har en metode writeObject, som vil serialisere en object-graf ud i en anden OutputStream, og den bruger Serializable til kontrol af, at klassen skal komme med. Hvis ikke kaster den en ekseption, her er et udpluk af dens handlemønster:
Object altobj = objectToSerialize();
    if (altobj != null && ! (altobj instanceof Serializable)) {
        String clname = altobj.getClass().getName();
        throw new NotSerializableException(clname);
    }

I den betydning, vil du kunne markere hvilke klasser, som kan serialiseres, og hvilke som ikke kan. Deruodver er der jo transient, som du har set lidt ovenfår.
Avatar billede tigtak Nybegynder
15. december 2001 - 16:59 #12
Når du implementerer interfacet Serializable, betyder det, at du (som programmør) har sikret dig at klassen\'s tilstand kan laves om til en bytestrøm. Der er altså et \"flag\" til JVM\'en
Avatar billede logical Nybegynder
16. december 2001 - 08:53 #13
tigtak>> Det er ikke noget flag, der er ikke noget specielt med klasser, som implementerer serializable. Det er en ganske almindelig kode konstruktion, og fungerer på nøjagtig samme måde. Kig på interfacet java.util.EventListener, det er samme opbygning.

Alle klasser kan serialiseres, hvis man skriver det selv, men fidusen med java.io.Serializable og java.io.ObjectOutputStream er netop, at det er ordnet på forhånd.
Avatar billede tigtak Nybegynder
16. december 2001 - 19:49 #14
logical>> Er med på hvad du siger, og er klar over at man kan bruge read /writeObject, men jeg vidregiver blot hvad min lærer fortalte mig om Serilizable (kontekst: RMI i EJB)...
Avatar billede logical Nybegynder
16. december 2001 - 21:59 #15
Så er han et fjols :-)

Husk på at en lærer fortæller kun hvad der er nødvendigt for at forstå tingene, ikke nødvendigvis den fulde sandhed....
Avatar billede hankster Nybegynder
16. december 2001 - 22:24 #16
jeg har fået det svar jeg søgte.. takker.

point bliver delt imellem de to deltagende svar.
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