Zitat von
Der_Unwissende:
Zitat von
Master-of-Magic:
Daher hab ich mir momentan folgende Variante überlegt:
1. Datei in Filestream (fs) einlesen und Version auslesen
2. fs in Memorystream (ms) kopieren
Ok, kannst Du diesen Teil denn schon begründen?
Ja, ich hab mir davon einen Geschwindigkeitsvorteil erhofft, wenn im
Ram gearbeitet wird, anstatt die HD zu belasten. Im Prinzip ist der Streamtyp egal.
Zitat:
An sich ist die Frage, wie deine Daten überhaupt gespeichert sind ganz Interessant. Liegen die Records denn direkt hintereinander in der Datei? Und weißt Du wieviele es sind?
Ja und Ja. Allerdings ist das Ganze etwas kompleer als nur einfach ein paar Records. Die Struktur sieht grob so aus:
Delphi-Quellcode:
type
TPlaneten = packed Record
[statische Arrays, Strings und Daten]
end;
TAccount = packed Record
Planet: array[0..12] of TPlaneten;
[statische Arrays, Strings und Daten]
end;
var
Account:Array[0..12] of TAccount;
Gespeichert wird einfach das Account-Array. Ändern tun sich in den Versionen meist die Anzahl der Account und die Inhalte des TPlaneten-Records.
Zitat:
Du nimmst einfach einen Alias für den aktuellen Datentypen und gibt ein Array von diesem Typen als Ergebnis des Ladens zurück.
Für die aktuelle Version muss also nur das übergebene Array zurückgegeben werden. Kommt eine neue Version hinzu, erstellst Du den entsprechenden neuen Datentypen und änderst den Alias TAktuellerTyp entsprechend ab. Zudem musst Du convert für diesen Typen überladen und das convert der Vorgängerversion anpassen. Das Laden gehört dann natürlich auch noch in die case-Anweisung, aber an sich halten sich (hoffentlich) die Änderungen in Grenzen.
Ich seh da aber ein Problem: Ich muss für jede Version das komplette Record erstellen. Würde das nicht heißen, ich hab für jede Version den Speicher reserviert? Mir scheint, dass das noch aufwändiger und Speicher fressender ist, als meine bisherige Methode ...
@Jelly
Zitat:
Warum hat Gott die objektorientierte Programmierung erfunden.
Ach Gott war das? Ich dachte, das wäre eine Nebenwirkung der Erfindung von C++ & Co. gewesen ...
Zitat:
Erstell Dir zu jeder Version eine Klasse, die sich ums Kovertieren kümmert. Willst Du ganz generisch halten, und dir die if-Abfragen (bzw. deine Case Strukur was genau das gleiche ist nur in grün), so kannst Du mit Metaklassen arbeiten. Ich hatte diese Problematik auch mal erfragt, und in diesem Thread wurd ziemlich gut erklärt, wie du sowas handeln kannst.
Da muss ich leider sagen, dass ich noch nie bewusst mit Klassen gearbeitet hab und daher auch keine Ahnung davon hab. Hast du mir da ein kleines Tutorial bzw. kannst mir ein Beispiel dazu geben?
Weil bisher klingt das auch so, als ob ich für jede Version das Array of Record erstellen müsste ... und das scheint mir mehr Aufwand, als mein bisheriger Weg.