User Tools

Site Tools


k7:k7.4:k7.4.8:k7.4.8.2:start

7.4.8.2 Export and import of derived arrays

The saving of derived arrays is characterized by some special features, because Gambas 3 can only save and read out native arrays in a file specific to gambas. You have to implement the serialization of the array elements of derived arrays during array export as well as the de-serialization during array import. In a suitable control structure, write the object properties of the objects stored in the elements of the derived array to the file stream one after the other, because object properties of native data type can serialize Gambas. If a property of an object is again an object, Gambas cannot serialize this property. You must then apply the procedure recursively until only native data types are available and can be saved.

When importing, you read the object properties from the export file and (re-)construct the array.

The project follows this plan:

  • First, a derived array is created and filled with random data.
  • The array elements are then displayed in the IDE console for control.
  • Then you can export the created array (without receipt in case of success)? file save dialog (binary file) or
  • import an array after a file open dialog from the export file.
  • Finally, the array elements of the imported array are displayed in the IDE console.

The array used in the project is an array derived from a self-written class and the elements of the array are objects of this class. The class CDS is a (pure) data structure without its own methods and represents, for example, a record in a course list.

Source code of 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

The complete project can be found in the download area and here you will find the source code of 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(..)

Comments:

  • The class CDS[] does not actually exist. However, since it ends with “[]” and there is a class CDS, the interpreter automatically creates on-the-fly a class CDS[] derived from CDS, which is an array of 'CDS' objects. For example, a new object of this array class is created in line 3:
Public arrayKL As New CDS[]
  • In lines 16 to 41, the array of 'CDS' objects - arrayKL - is filled with 10 data records of type CDS. First, the For-Next control structure successively creates space for a new array element in array arrayKL (line 27), then a new, empty data record of type CDS is created and immediately filled with random values. Finally (line 34), the current data record is inserted as an element in the array arrayKL. In line 38, all ten records are output as contents of array array arrayKL formatted for control purposes and displayed in the console of the Gambas IDE.
  • The export of the derived array array arrayKL takes place in lines 43 to 70. If the file save dialog is successfully closed, a new file with the given path is created and opened for writing.
  • For all ten elements of the array arrayKL of object type CDS, the 6 object properties are written one after the other into the file stream. The file is then closed.
  • In line 84, all elements of the existing array array arrayKL are deleted using the Clear method.
  • When importing in lines 72 to 102, the path to the file with the exported array is available after the successful file open dialog and the file is opened for reading.
  • As long as the end of the file has not yet been reached, the elements of the array arrayKL are generated as CDS objects serially from the 6 values of the object properties and inserted into the array arrayKL (lines 86 to 95).
  • Finally, in line 104 all ten records are output as contents of the (imported) array array array arrayKL formatted and displayed in the console of the Gambas IDE:
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

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:

  • Zuerst wird ein abgeleitetes Array angelegt und mit Zufallsdaten gefüllt.
  • Die Array-Elemente werden danach in der IDE-Konsole zur Kontrolle angezeigt.
  • Dann kann man das angelegte Array exportieren (ohne Quittung im Erfolgsfall) → Datei-Speichern-Dialog (binäre Datei) oder
  • ein Array nach einem Datei-Öffnen-Dialog aus der Export-Datei importieren.
  • Abschließend werden die Array-Elemente des importierten Arrays in der IDE-Konsole angezeigt.

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:

  • ListenpunktDie Klasse CDS[] existiert eigentlich nicht. Da sie aber mit “[ ]” endet und es eine Klasse CDS gibt, erstellt der Interpreter automatisch on-the-fly eine von CDS abgeleitete Klasse CDS[], die ein Array von 'CDS'-Objekten ist. So wird zum Beispiel in der Zeile 3 ein neues Objekt dieser Array-Klasse erzeugt:
Public arrayKL As New CDS[]
  • In den Zeilen 16 bis 41 wird das Array von 'CDS'-Objekten – arrayKL – mit 10 Datensätzen vom Typ CDS gefüllt. Zuerst wird in der For-Next-Kontroll-Struktur sukzessive Platz für ein neues Array-Element im Array arrayKL geschaffen (Zeile 27), dann ein neuer, leerer Datensatz vom Typ CDS angelegt und sofort mit Zufallswerten gefüllt. Abschließend (Zeile 34) wird der aktuelle Datensatz als Element in das Array arrayKL eingefügt. In der Zeile 38 werden alle zehn Datensätze als Inhalt des Arrays arrayKL formatiert zur Kontrolle ausgegeben und in der Konsole der Gambas-IDE angezeigt.
  • Der Export des abgeleiteten Arrays arrayKL erfolgt in den Zeilen 43 bis 70. Wird der Datei-Speichern-Dialog erfolgreich beendet, wird eine neue Datei mit dem übergebenen Pfad angelegt und zum Schreiben geöffnet.
  • Für alle zehn Elemente des Arrays arrayKL vom Objekt-Typ CDS werden die 6 Objekt-Eigenschaften nacheinander in den Datei-Stream geschrieben. Dann wird die Datei geschlossen.
  • In der Zeile 84 werden alle Elemente des existierenden Arrays arrayKL mit der Clear-Methode gelöscht.
  • Beim Import in den Zeilen 72 bis 102 steht nach dem erfolgreichen Datei-Öffnen-Dialog der Pfad zur Datei mit dem exportierten Array zur Verfügung und die Datei wird zum Lesen geöffnet.
  • Solange das Ende der Datei noch nicht erreicht ist, werden die Elemente des Arrays arrayKL als CDS-Objekte seriell aus den 6 Werten der Objekt-Eigenschaften generiert und in das Array arrayKL eingefügt (Zeilen 86 bis 95).
  • Abschließend werden in der Zeile 104 alle zehn Datensätze als Inhalt des (importierten) Arrays arrayKL formatiert ausgegeben und in der Konsole der Gambas-IDE angezeigt:
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

The website uses a temporary session cookie. This technically necessary cookie is deleted when the browser is closed. You can find information on cookies in our privacy policy.
k7/k7.4/k7.4.8/k7.4.8.2/start.txt · Last modified: 02.07.2018 (external edit)

Page Tools