Avatar billede codemon Nybegynder
14. december 2000 - 18:18 Der er 13 kommentarer og
2 løsninger

Save objekter til fil

Ville høre om andre har haft lignende problemer.

Jeg har en række hægtede lister og arrays som bliver lagt i ét objekt. Når det bliver hentet fra harddisken igen mangler nogle atributter pludselig fra objekterne.

Jeg har en test-fil som opretter hele objekthierakiet istedet for at indlæse fra fil og der virker det.
Avatar billede lucifer Nybegynder
14. december 2000 - 18:25 #1
Hvor dan skriver du objekterne til filen og hvordan læsere du dem??

Noget kunne tyde på, at de ikke læser filen på samme måde som de forskellige atributter bliver skrevet i filen.

Har du kontrolleret, at de atributter der mangler overhovedet bliver skrevet i filen??
Avatar billede codemon Nybegynder
14. december 2000 - 18:42 #2

Metoden der saver:

  public static void saveData(KovsData data) throws Exception
  {
      FileOutputStream udFil = new FileOutputStream (navn);
      ObjectOutputStream udObject = new ObjectOutputStream (udFil);
       
      udObject.writeObject(data);
      udFil.close();
  }

Dette er constructor i klassen, for data-objektet som gemmes på disk

  public KovsData(ObjectList vaergeliste, ObjectList venteliste,
                  Institutionstype[] typer, ObjectList distriktliste,
                  Kommune[] kommuner)
  {

Der modtages: ObjectList - objekter er hægtede lister
Det er underligt nok ikke alle atributter der tabes. fx i objekter fra en klasse Barn tabes cpr nummeret, men navnet beholdes (ligger i venteliste)
Efter indlæsning fra harddisk kaldes metoder til at få de enkelte lister og arrays ud fra det samlede objekt fx
public ObjectList getVenteliste ()
{
  return venteliste;
}
Avatar billede lucifer Nybegynder
14. december 2000 - 18:53 #3
Er det korrekt forstået, at du gemmer et objekt, der indholder referencer til flere forskellige hægtede lister + div arrays, og det er det du gør i

udObject.writeObject(data);

Hvordan ser din metode til at indlæse det object(er) ud ??.

Og er alle informationerne overhovedet gemt i filen du læser ind fra??

Avatar billede codemon Nybegynder
14. december 2000 - 19:08 #4
Ja der gemmes et objekt med referencer til hægtede lister som har objekter der igen peger på kryds og tværs til andre lister. Derfor ligger det i et objekt da referencerne ellers bliver \"skåret over\" imellem de hægtede lister, men så opstod dette problem.
Der indlæses med:

  public static KovsData loadData() throws Exception
  {
      KovsData data;
      FileInputStream  indFil = new FileInputStream (navn);
      ObjectInputStream indObject = new ObjectInputStream (indFil);
       
      data = (KovsData)indObject.readObject();
      indFil.close();
      return data;
  }

og nej, alle informationerne bliver vist ikke gemt. jeg kan ihvertfald ikke finde dem ved at søge i filen. Selvom de er der øjeblikket før der bliver gemt:

  try
  {
      System.out.println (nydata);

      Config.saveData(nydata);
  }
  catch (Exception e)
  {
      System.out.println(e);
  }

SOP\'erne printer alle data ud da toString løber alle objekter igennem i de hægtede lister.
Avatar billede lucifer Nybegynder
14. december 2000 - 19:26 #5
Jeg er desværre bange for, at din opbygning af objekter gør, at det ikke er lige til, at gemme og hente dine objekter.

Hvis du gemmer dine hægtede lister seperat (ikke som del af et andet objekt) gemmes alle data så ??


Såfremt at de gør det, så ville jeg opbygge min gem metode,op på den måde, at jeg for det givne objekt gemmer de enkelte hægtede lister en ad gangen. Det samme gælder for de arrays du har.

Indlæsningen foregår så i samme rækkefølge som jeg gemte de forskellige ting.
Avatar billede davsclaus Nybegynder
14. december 2000 - 20:16 #6
Dine objecter skal implementere interfacet Serializable for at de kan blive skrevet og læst fra disk.
Avatar billede codemon Nybegynder
14. december 2000 - 20:30 #7
Hvis de hægtede lister gemmes hver for sig klippes referencerne imellem dem over. Altså en hægtet liste indeholder objekter som peger på objekter i en anden hægtet liste eller array.

Når listerne genindlæses hver for sig peger objekterne i den første så på deres egne objekter og ikke dem i den anden liste (i øvrigt et problem der voldte gevaldige kvaler i klassen - det er et projekt på datamatiker udd. og damn det skal afleveres i morgen eftermiddag)

Derfor blev alle lister og arrays lagt i ét \"save-objekt\", men nu tabes atributterne altså på de enkelte objekter fra listen.

Der er før gemning af de \"store\" objekter blevet testet på objekter af \"fake\" klasser.
Avatar billede lucifer Nybegynder
14. december 2000 - 20:49 #8
Davsclaus har højst sandsynligt fat i noget - efter at jeg har konsulteret en bog, der lå og samlede støv.

med hensyn til din datastruktur skal det forståes sådan, at de enkelte elementer i den hægtede liste, ud over at pege på elementer af egen type ( det er lige som det der udgør den hægtede liste), også har referencer til andre elementer der værd i sær indgår i en anden hægtet liste eller i et array.

Det du beskriver minder umiidelbart ikke meget om en hægtet liste. (muligvis mig der misforstår det du skriver)
Avatar billede codemon Nybegynder
14. december 2000 - 21:13 #9
Jeg er ikke så god til at forklare mig, men jeg ved godt hvad hægtede lister er. Og jo objektet der er den hægtede liste peger på et objekt af sin egen type. Det peger også på et objekt som er dataene i den hægtede liste og det er det objekt som bla. peger videre på objekter i andre hægtede lister. (et eller flere af dets atributter)

Det lavede problemer. Nu er det alm. Strings der tabes.

Alle objekter implementerer Serializable interfacet. Og det gør String jo også så det er altså ikke der problemet er.

I øvrigt implementerer alle objekter, lagt i listerne, også vores eget interface så der kan bruges polymorfisme ved kald af metoder fra control-klassen til de hægtede lister som modtager objekter ved hjælp af interfacets reference.
Avatar billede lucifer Nybegynder
14. december 2000 - 21:27 #10
Jeg er desværre bange for, at min førstehjælps taske er udgået for medicin og brandslangen tør for vand, på nuværende tidspunkt.

Nu kender jeg ikke opgaven, men det virker som en noget uoverskuelig grundlæggende datastruktur.
Avatar billede codemon Nybegynder
14. december 2000 - 21:35 #11
Well ok, sikkert heller ikke smart at lave datastrukturer af den art når man går på 1. semester. Håbede at vi bare havde lavet en generel brøler, men problemet må vel være større end det - altså når brugerne på eksperten ikke kan hjælpe hvem skulle så kunne...

codemon
Avatar billede lucifer Nybegynder
14. december 2000 - 21:40 #12
Ny ved jeg ikke hvordan dit udviklingsforløb har været men lidt analyse til at starte med er en god ting, i stedet for bare at gå i gang med at kode.
Tro mig jeg har set og følt det selv.

Men hvem ved, der kan stadig dukke en op med de vise sten. :-)
Avatar billede codemon Nybegynder
14. december 2000 - 22:50 #13
Fandt fejlen, \"lille\" brøler som jeg troede i starten.
Et par klasser i systemet arvede nogle attributter. Klassen de arvede fra implementerede ikke Serializable.

>> lucifer læg et svar. Det er min politik at stiller jeg spørgsmål og en prøver at hjælpe skal det ikke være spildt arbejde selvom jeg selv finder ud af det.
Halvdelen af pointene er dine.
Avatar billede lucifer Nybegynder
14. december 2000 - 22:52 #14
Det var det jeg sagde, de vise sten kommer på et eller andet tidspunkt :-)
Avatar billede codemon Nybegynder
15. december 2000 - 07:31 #15
Egentlig en lille svaghed i java. Burde melde fejl, det gør den jo hvis det er nogen af de andre.
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