7.4.8.2 Export und Import abgeleiteter Arrays

Das Abspeichern abgeleiteter Arrays zeichnet sich durch einige Besonderheiten aus, denn Gambas 3 kann nur native Arrays in einer Datei gambas-spezifisch speichern und wieder auslesen. Sie müssen die Serialisierung der Array-Elemente abgeleiteter Arrays beim Array-Export als auch die De-Serialisierung beim Array-Import selbst umsetzen. In einer geeigneten Kontrollstruktur schreiben Sie die Objekt-Eigenschaften der in den Elementen des abgeleiteten Arrays gespeicherten Objekte nacheinander in den Datei-Stream, denn Objekt-Eigenschaften von nativem Daten-Typ kann Gambas serialisieren. Ist eine Eigenschaft eines Objektes wieder ein Objekt, so kann Gambas diese Eigenschaft natürlich nicht serialisieren. Sie müssen das Verfahren dann rekursiv anwenden bis nur noch native Daten-Typen vorliegen und gespeichert werden können.

Beim Import lesen Sie die Objekt-Eigenschaften aus der Export-Datei und (re-)konstruieren das Array.

Im Projekt wird dieser Plan verfolgt:

Das im Projekt verwendete Array ist ein aus einer selbst geschriebenen Klasse abgeleitetes Array und die Elemente des Arrays sind Objekte dieser Klasse. Die Klasse CDS ist eine (reine) Datenstruktur ohne eigene Methoden und repräsentiert hier zum Beispiel einen Datensatz (Rekord) in einer Kursliste.

Quelltext von CDS.class:

' Gambas class file

Public JGS As Integer
Public GebDatum As Date
Public Vorname As String
Public Nachname As String
Public Kurs1 As String
Public Kurs2 As String

Das vollständige Projekt finden Sie im Download-Bereich und hier den Quelltext von FMain.class:

[1] ' Gambas class file
[2] 
[3] Public arrayKL As New CDS[] ' Objekt mit dem Namen arrayKL der Array-Klasse CDS[] erzeugen 
[4] Public hCDS As CDS ' Variable vom Typ CDS anlegen
[5] 
[6] Public Sub Form_Open()
[7]   FMain.Center
[8]   FMain.Resizable = False
[9]   If Not Exist(Application.Path &/ "array.dat") Then
[10]      SetEnabled(True, False, False)
[11]   Else
[12]      SetEnabled(True, False, True)
[13]   Endif
[14] End ' Form_Open()
[15] 
[16] Public Sub btnSetClassArray_Click()
[17]   Dim iCount As Integer
[18]   Dim aNames As String[] = ["Adler", "Bär", "Dachs", "Fuchs", "Meise", "Uhu"]
[19]   Dim aSurNames As String[] = ["Anna", "Bruno", "Doris", "Fred", "Maria", "Udo"]
[20]   Dim aCourses1 As String[] = ["Mathematik", "Geschichte", "Astronomie", "Biologie", "Informatik"]
[21]   Dim aCourses2 As String[] = ["Deutsch", "Physik", "Englisch", "Kunst", "Musik"]
[22]   
[23]   Randomize
[24]     
[25]   For iCount = 0 To 9
[26]     hCDS = New CDS
[27]       hCDS.JGS = CInt(Rnd(11, 13)) ' 11..12
[28]     ' Zufallsdatum: Jahr: passend zur JGS, Monat: 1..12, Tag: 1..28 (das passt immer...)
[29]       hCDS.GebDatum = Date(Int(Rnd(Year(Now())-18, Year(Now())-16)), Int(Rnd(1,13)), Int(Rnd(1,29)))
[30]       hCDS.Vorname = aSurNames[Int(Rnd(0, aSurNames.Count))]
[31]       hCDS.Nachname = aNames[Int(Rnd(0, aNames.Count))]
[32]       hCDS.Kurs1 = aCourses1[Int(Rnd(0, aCourses1.Count))]
[33]       hCDS.Kurs2 = aCourses2[Int(Rnd(0, aCourses2.Count))]
[34]     arrayKL.Add(hCDS)
[35]   Next ' iCount
[36] 
[37] ' Anzeige aller Datensätze (Konsole der IDE) zur Kontrolle
[38]   ShowCDSArrayElements(arrayKL)
[39]   SetEnabled(True, True, False)
[40] 
[41] End ' btnClassArray_Click()
[42] 
[43] Public Sub btnArrayDatenExport_Click()
[44]   Dim iCount As Integer
[45]   Dim hFile As File
[46] 
[47] ' Speichern aller Elemente des abgeleiteten Arrays 'arrayKL' in einer Datei
[48]   Dialog.Title = "Array-Export in eine binäre Datei"
[49]   Dialog.Filter = ["*.dat", "Daten-Dateien"]
[50]   Dialog.Path = Application.Path &/ "array.dat"
[51]   
[52]   If Dialog.SaveFile() Then Return
[53]   hFile = Open Dialog.Path For Write Create
[54] 
[55] ' Serialisierung der Objekt-Eigenschaften
[56]   For iCount = 0 To arrayKL.Max
[57]       With arrayKL[iCount]
[58]         Write #hFile, .JGS As Integer
[59]         Write #hFile, .GebDatum As Date
[60]         Write #hFile, .Vorname As String
[61]         Write #hFile, .Nachname As String
[62]         Write #hFile, .Kurs1 As String
[63]         Write #hFile, .Kurs2 As String
[64]       End With
[65]   Next
[66] 
[67]   Close #hFile  
[68]   SetEnabled(True, True, True)
[69]   
[70] End ' btnDatenExport_Click()
[71] 
[72] Public Sub btnArrayDatenImport_Click()
[73]   Dim iCount As Integer
[74]   Dim hFile As File
[75] 
[76] ' Einlesen aller Elemente des abgeleiteten Arrays 'arrayKL' aus einer Datei
[77]   Dialog.Title = "Array-Import aus einer binären Datei"
[78]   Dialog.Filter = ["*.dat", "Daten-Dateien"] 
[79]   Dialog.Path = Application.Path &/ "array.dat"
[80]   
[81]   If Dialog.OpenFile() Then Return
[82]   hFile = Open Dialog.Path For Read
[83]   
[84]   arrayKL.Clear
[85] ' De-Serialisierung
[86]   While Not Eof(hFile)
[87]     hCDS = New CDS
[88]       hCDS.JGS = Read #hFile As Integer
[89]       hCDS.GebDatum = Read #hFile As Date
[90]       hCDS.Vorname = Read #hFile As String
[91]       hCDS.Nachname = Read #hFile As String
[92]       hCDS.Kurs1 = Read #hFile As String
[93]       hCDS.Kurs2 = Read #hFile As String
[94]     arrayKL.Add(hCDS)
[95]   Wend
[96] 
[97] ' Anzeige aller Datensätze (IDE-Konsole)
[98]   ShowCDSArrayElements(arrayKL)
[99]   Close #hFile  
[100]   SetEnabled(True, True, True)
[101] 
[102] End ' btnDatenImport_Click()
[103] 
[104] Private Sub ShowCDSArrayElements(aArray As CDS[])
[105] ' Anzeige aller Datensätze (Konsole der IDE) 
[106]   For Each hCDS In aArray
[107]     Print hCDS.JGS,
[108]     Print Format(hCDS.GebDatum, "dd.mm.yyyy"),
[109]     Print hCDS.Vorname,
[110]     Print hCDS.Nachname,
[111]     Print hCDS.Kurs1,
[112]     Print hCDS.Kurs2
[113]   Next ' hCDS  
[114]   Print
[115] End ' ShowCDSArrayElements(aArray As CDS[])
[116] 
[117] Public Sub SetEnabled(bAR As Boolean, bEX As Boolean, bIM As Boolean)  
[118]   btnSetClassArray.Enabled = bAR
[119]   btnArrayDatenExport.Enabled = bEX
[120]   btnArrayDatenImport.Enabled = bIM  
[121] End ' SetEnabled(..)

Kommentare:

Public arrayKL As New CDS[]
11      17.08.1997      Anna    Bär     Mathematik      Musik
11      23.11.1996      Maria   Bär     Astronomie      Physik
12      19.02.1997      Bruno   Bär     Astronomie      Kunst
12      03.12.1996      Anna    Dachs   Astronomie      Musik
12      05.07.1997      Maria   Bär     Geschichte      Deutsch
12      19.09.1996      Doris   Uhu     Geschichte      Englisch
12      03.09.1996      Maria   Bär     Mathematik      Englisch
12      01.09.1996      Udo     Meise   Informatik      Deutsch
12      24.09.1996      Doris   Uhu     Informatik      Deutsch
11      24.10.1997      Doris   Meise   Mathematik      Physik

Download