Avatar billede jonas_h Nybegynder
13. januar 2006 - 18:00 Der er 21 kommentarer

Gemme et objekt i en fil.

Er det muligt at gemme et objekt i en fil? Altså så når man "loader" filen ind, så indeholder det loadede objekt samme mængde data osv som da man gemte - dvs. også objekter oprettet inde i "hovedobjektet".

Håber I forstår hvad jeg mener - det er lidt kringlet at skulle forklaare på skrift =)
Avatar billede arne_v Ekspert
13. januar 2006 - 18:27 #1
serialisering

enten normal binær serialisering eller XML serialisering
Avatar billede kalp Novice
13. januar 2006 - 18:42 #2
Avatar billede jonas_h Nybegynder
13. januar 2006 - 18:48 #3
Tak :) Meget sjovt, lidt efter jeg havde skrevet indlægget fandt jeg selv ovenstående side som beskriver det perfekt!
Avatar billede arne_v Ekspert
13. januar 2006 - 18:56 #4
der er lidt forskellige regler for binær serialisering og XML serialisering
Avatar billede jonas_h Nybegynder
13. januar 2006 - 18:56 #5
Hmm jeg får en exception når jeg prøver at gøre det.
java.io.NotSerializableException
Ved I hvad det kan være?
Avatar billede arne_v Ekspert
13. januar 2006 - 18:57 #6
følgende viser forskellen:

import java.util.*;
import java.beans.*;
import java.io.*;

public class SerTest implements Serializable {
    public int a;
    private int b;
    private transient int c;
    private HashMap hm1;
    private HashMap hm2;
    public SerTest() {
        a = 0;
        b = 0;
        c = 0;
        hm1 = new HashMap();
        hm2 = new HashMap();
    }
    public SerTest(int a, int b, int c, String v) {
        this.a = a;
        this.b = b;
        this.c = c;
        hm1 = new HashMap();
        hm2 = new HashMap();
        hm1.put("k1", v);
        hm2.put("k2", v);
    }
    public int getB() {
        return b;
    }
    public int getC() {
        return c;
    }
    public HashMap getHm1() {
        return hm1;
    }
    public void setB(int b) {
        this.b = b;
    }
    public void setC(int c) {
        this.c = c;
    }
    public void setHm1(HashMap hm1) {
        this.hm1 = hm1;
    }
    public String toString() {
        return (a + " " + b + " " + c + " " + hm1 + " " + hm2);
    }
    public static void main(String[] args) throws Exception {
        SerTest st1 = new SerTest(1, 2, 3, "V");
        XMLEncoder xe = new XMLEncoder(new FileOutputStream("C:\\xml.dat"));
        xe.writeObject(st1);
        xe.close();
        XMLDecoder xd = new XMLDecoder(new FileInputStream("C:\\xml.dat"));
        SerTest st2 = (SerTest)xd.readObject();
        System.out.println(st1 + " -> " + st2);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\bin.dat"));
        oos.writeObject(st1);
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\bin.dat"));
        SerTest st3 = (SerTest)ois.readObject();
        System.out.println(st1 + " -> " + st3);
    }
}
Avatar billede arne_v Ekspert
13. januar 2006 - 18:58 #7
du mangler nok:

implements Serializable

på din klasse ...
Avatar billede jonas_h Nybegynder
13. januar 2006 - 18:59 #8
Altså den klasse for det objekt jeg vil gemme? Skal den også være på alle "underklasser" i hovedklassen?
Avatar billede jonas_h Nybegynder
13. januar 2006 - 19:00 #9
Får denne fejl når jeg tilføjer det du skrev:
cannot find symbol
symbol: class Serializable
Avatar billede jonas_h Nybegynder
13. januar 2006 - 19:03 #10
Hvilke metoder er der i interfacet?
Avatar billede arne_v Ekspert
13. januar 2006 - 19:07 #11
import java.io.Serializable;
Avatar billede arne_v Ekspert
13. januar 2006 - 19:08 #12
der er ingen metoder i interfacet

det er kun en markering af at klassen kan serialiseres
Avatar billede arne_v Ekspert
13. januar 2006 - 19:08 #13
og ja - alle indeholdte objekter (bortset fra dem erklæret transient) skal også
være serializable
Avatar billede jonas_h Nybegynder
13. januar 2006 - 19:13 #14
Så virker det =) Mange tak! Bare skriv et svar, så får du point.
Avatar billede jonas_h Nybegynder
13. januar 2006 - 19:24 #15
Nu har jeg så fået den til at gemme - men lige et spørgsmål:
Når jeg så henter den ind, er der så en smart måde, at få den til at "opdatere" alle de referencer der nu er til det "gamle" objekt?
I starten har jeg
Functions f = new Functions()
f er så reference til nogle paneler... Når jeg så loader ind, siger jeg
f = "Det nye objekt"
men så opdateres det ikke i alle panelerne... Hvis du forstår? =)
Avatar billede kalp Novice
13. januar 2006 - 19:50 #16
Du skal måske kalde repaint() på panel'erne?
Avatar billede jonas_h Nybegynder
13. januar 2006 - 19:52 #17
Hjælper ikke - som om de stadig har referencen til det "gamle" Functionsobjekt.
Avatar billede kalp Novice
13. januar 2006 - 19:57 #18
this.repaint(); ?

blot et bud:)
Avatar billede jonas_h Nybegynder
13. januar 2006 - 19:59 #19
Hehe nej det er ikke fordi den ikke repainter... Det gør den automatisk.
Den refererer stadig til det gamle Functionsobjekt.
Avatar billede kalp Novice
13. januar 2006 - 20:33 #20
hmmm.. jeg tror faktisk ikke det kan lade sig gøre:/
Har lige siddet og leget lidt med det.. og det var ret umuligt.

men du kan vel hive data ud fra dine objekter som du henter op og erstatte det som der står i dine gamle objekter..

Det tager længere tid, men det virker. ved brug af metodekald
Avatar billede jonas_h Nybegynder
13. januar 2006 - 20:37 #21
Jeps, har også løst det sådan.. Det er bare en lidt irriterende metode hvis der tilføjes noget i Functions.. Så skal man også tilføje noget i den "update" metode...
Men det er i hvert fald løst og det virker nu :)
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