Array einer Struktur speichern und wieder laden.

OP #5982405
Hallo zusammen,

ich habe eine Frage zum FileStream. Ich möchte eine erstellte Struktur 
auf der Festplatte speichern um sie bei erneutem Aufruf des Programms 
wieder laden zu können.
Zur Struktur

public struct konfiguration

{
            public int id;
            public string name;
            public string description;
}
//Die Struktur hat noch weiter Variablen, aber alles int oder string von 
//daher abgekürzt

konfiguration[] neu = new konfiguration[200];
konfiguration[] zwischen = new konfiguration[200];

Nach jedem Eingeben der Werte in Textfeldern wird diese in einem 
FileStream gespeichert.(Datei ist angehangen)

FileStream savedata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Append);
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(savedata, neu[i]);
            savedata.Close();

Um die Datei zu laden habe ich folgendes gemacht:

FileStream readdata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            konfiguration zwischen = (konfiguration) 
formatter.Deserialize(readdata);

Meine Frage:
Ich verstehe nicht ganz, was in die Variable "zwischen" gespeichert 
wurde. Ist das der gesamte Inhalt der .txt Datei? Mit dem Befehl
Textfeld1.Text = zwischen.name;

wird mir der Name des ersten Eintrags angezeigt. "neu[0].name" 
sozusagen. Wie kann ich mir neu[1].name usw. anzeigen lassen?
Angehängte Dateien:
Gast
zwischen ist genau ein struct vom Typ konfiguration.
Was du machst ist: du serialisierst alles nach einander und liest nur 
wieder das erste Element ein.

Was du willst: Mach dir ein struct mit dem Array von konfiguration als 
Typ und serialisiere dieses struct.

Und btw. schreib die Typen Namen groß...
OP
Wenn ich dich richtig verstehe erstelle ich folgende Struktur:

 [Serializable]
        public struct Speichern
        {
           public Konfiguration[] abspeichern;
        }
Speichern[] save = new Speichern[200];

Werte zuweisen und abspeichen geht dann folgender Maßen?(Habe den 
Fildemode auf "Create" geändert. Datei ist wieder angehangen)

save[i].abspeichern= neu;

            FileStream savedata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();

            formatter.Serialize(savedata, save);
            savedata.Close();

Wird dadurch ein Array mit dem Aufbau save[] = {neu[0];neu[1];usw.} 
abgespeichert?

Wenn ich die Datei dann wieder laden möchte bekomme ich die 
Fehlermeldung "Die angegebene Umwandlung ist ungültig"

FileStream readdata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
             Speichern zwischen = (Speichern) 
formatter.Deserialize(readdata);


Ich habe bisher eher in C programmiert und bin in C# noch recht am 
anfang(ist dir wahrscheinlich schon aufgefallen)

Wenn ich wie oben beschrieben falsch vorgehe wäre ein Code Beispiel 
super. Mit google und den Microsoft Hilfen verstehe ich das recht 
schwer. Da läuft das mehr nach dem Prinzig "Try and Error".
Angehängte Dateien:
Gast
Nut mal nebenbei, das ist keine Textdatei. Die Dateiendung "txt" ist 
hier unschön. Du könntest generisch "bin" nutzen oder auch "cfg" oder 
ähnlich.
Musste ich mal loswerden ;-)


Zum eigentlichen Thema sage ich lieber nix ;-) Serialisieren finde ich 
sehr unschön. Besser ist es (IMHO) Konfiguration im ini oder xml Format 
zu speichern (oder auch in der Registry). Und dann bitte auch an der 
richtigen Stelle.

Ist für ein privates Hobbyprojekt zwar nicht wichtig, aber es schadet 
nich es gleich richtig zu machen.
(Firma: Q3)
Ich würde da besser eine HashMap verwenden, die kann als Value auch 
Objekte aufnehmen. Statt der Struct machst du ein Objekt mit all den 
Attributen in den versch. Typen. Der Vorteil ist auch, dass man sich bei 
einer HashMap nicht vorher bezüglich der Größe festlegen muss. Speichern 
kann man die HashMap so:
1
FileOutputStream outStream = new FileOutputStream(fname);
2
ObjectOutputStream outObj = new ObjectOutputStream(outStream);    
3
outObj.writeObject(outMap);                      
4
outObj.flush();                            
5
outObj.close();                            
6
outStream.close();

Einlesen geht so:
1
FileInputStream inpStream = new FileInputStream(fname);
2
ObjectInputStream inpObj = new ObjectInputStream(inpStream);    
3
inpMap=(HashMap<String,Object>)inpObj.readObject();        
4
inpObj.close();                            
5
inpStream.close();
(Firma: Q3)
test schrieb:

> Zum eigentlichen Thema sage ich lieber nix ;-) Serialisieren finde ich
> sehr unschön. Besser ist es (IMHO) Konfiguration im ini oder xml Format
> zu speichern (oder auch in der Registry). Und dann bitte auch an der
> richtigen Stelle.

Java-Programme sollten plattform-Unabängig sein. "Registry" passt da 
nicht ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.