AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Records/Typen erkennen

Ein Thema von TheMiller · begonnen am 2. Mai 2012 · letzter Beitrag vom 4. Mai 2012
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Records/Typen erkennen

  Alt 2. Mai 2012, 19:53
Delphi-Version: 2009
Hallo,

ich speichere Daten mittels MemoryStream in eine Datei. Ganz vorne in der Datei befindet sich ein Header, welcher Infos über die Positionen gibt (Start-Positionen der Einträge).

Nun möchte ich vorausschauend programmieren und es kann durchaus sein, dass mal diese Struktur geändert wird. Gibt es eine Möglichkeit automatisch erkennen zu lassen, welcher Header (also was für ein Record gespeichert wurde), oder soll ich den Header um 2 Byte nach hinten verschieben und die ersten 2 Byte mit einer Versionsnummer bestücken?

Dann würde ich die ersten 2 Byte zuerst lesen, dann den Header in das entsprechende Record laden und dann erst die Daten einlesen.

Könnt ihr mir sagen, wie's richtig gemacht wird?

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#2

AW: Records/Typen erkennen

  Alt 2. Mai 2012, 20:18
Du kannst dir auch erstmal einen allgemeinen Header erstellen, wo Dateityp, Versionsnummer und sowas drinsteht und danach dann den spezifischen Header der entsprechenden Version.

Du du ja jetzt noch nicht weißt wie groß mal zukünftige Herader werden, bringt es nicht viel, wenn irgendwo am Ende/in der Mitte die Version steht ... diese Version mußt du schließlich auch irgendwann wiederfinden müssen, bzw. es währe zu blöde, wenn an der Stelle, wo du jetzt die Version hinmachst, irgendwas Anderes steht, welches zufällig mit deiner aktuellen Versionsnummer übereinstimmt.
Also entweder ganz am Anfang oder eben einen definierten Header am Anfang.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Records/Typen erkennen

  Alt 2. Mai 2012, 21:28
Sofern du keine intelligente Handhabung der Daten hast und diese etwas größer sind (> 1 gb?), dann, sobald es zu einer Überschneidung zwischen Header und Daten wegen einer evt. Vergrößerung des Headers im weiteren Verlauf der Entwicklung des Programmes kommt, könnte sich das als ein Riesenproblem erweisen.

Ich frag mich gerade, ob es da nicht besser wäre, den Header wirklich generell ganz hinten in der Datei zu haben und verkehrt herum aufzubauen?!

Ich hatte ein ähnliches "Problem" (nun es war kein wirkliches Problem) - bei meinem Virtuelle-Festplatte Projekt hatte ich ja nen anwachsenden/schrumpfenden Header Abschnit und nen Datenabschnitt. Zu Hilfe kam mir die Fragmentation (Überschneidende Daten wurden fragmentiert hinten angefügt), die natürlich aus performanzgründen gemieden wurde, da ein anderer Algorithmus mehr Speicher als nötig für den Header allozierte..

Edit: Zur eigentlichen Frage (Threadtitel) - jo, ich würd da auch ne Versionsnummer verwenden!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 2. Mai 2012 um 21:36 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 07:07
Wieso verwendest Du kein Datenformat, wie z.B. JSON?

Mit den Versionsnummern wird die Leseroutine sehr schnell sehr unübersichtlich, aber es funktioniert.
Delphi-Quellcode:
Procedure TMyClass.ReadFromStream(aVersion : Integer; aStream : TStream);
Begin
  Name := ReadString(aStream);
  LastName := ReadString(aStream);
  if aVersion>1020 then begin
    Middle := ReadString(aStream);
    If aVersion>1030 then
      birthday := ReadDate(aStream);
    ...
  end;
...
end;

Geändert von Furtbichler ( 3. Mai 2012 um 07:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 13:20
Hallo,

meine Dateien werden im Regelfall recht klein (ca. 100 kb). Vereinzelt kann mal eine mehrere MB, nicht aber hunderte von MBs oder gar GBs erreichen.

Ich brauche nur die Information, was es für eine Datei ist und welche Version sie hat. Ich denke, dann baue ich einfach zwei Header. Einen, der nur Version und Dateityp beinhaltet, der zweite Header gibt dann die Infos für die Strings.

Mit diesen Dateien wird sowieso recht selten gearbeitet. Es ist nur ein "Zusatz" zur Datenbank.

Den Header ans Ende der Datei schreiben finde ich irgendwie nicht so sauber, oder? Heißt ja header, nicht footer

Danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 13:50
Delphi-Quellcode:
type
  TVersionFileHeader =
    Signatur: array[1..4] of AnsiChar;
    Version: Word;
  end;

  TFileHeaderXyzV1 =
    Version: TVersionFileHeader;
    A: Byte;
    B: Word;
    ... weitere Felder für V1
  end;

  TFileHeaderXyzV2 =
    Version: TVersionFileHeader;
    C: LongWord;
    D: Word;
    ... weitere Felder für V2
  end;
Wenn die Header möglichst jeweils gleich groß sind, dann könnte man auch ... (mir fällt grade der Name nicht ein)

Delphi-Quellcode:
type
  TMyFileHeader =
    Signatur: array[1..4] of AnsiChar;
    Version: Word;
    case Integer of
      0: (A: Byte;
          B: Word;
          ... weitere Felder für V1);
      2: (C: LongWord;
          D: Word;
          ... weitere Felder für V2);
  end;
Alternativ könnte man sich auch einen Header ala TReader/TWriter aufbauen, welcher deinen Aufbau gleich mitbringt (quasi wie eine binäre XML).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 14:06
Ich benutze gern magische Zahlen am Dateibeginn, Abschnittsbeginn und Dateiende.
Die Zahlen am Dateibeginn (z.B. mal zufällig $38 $94 $F3 $21 oder so) versichern der Leseroutine, dass es sich tatsächlich um den erwarteten Dateityp (und -version) handelt. Jede neue Version bekommt leicht abgewandelte Zahlen und jeder neue Dateityp sowieso komplett andere.
Die Zahlen am Abschnittsbeginn versichern der Leseroutine, dass der Zeiger im Header auch richtig stand. Zudem kann man dadurch auch einzelne Abschnittstypen besser versionieren. Änderst du z.B. nur eine Recorddefinition, dann brauchst du auch nur eine neue Version dieses Abschnitttyps, und nicht des ganzen Dateityps.
Die Zahlen am Dateiende zeigen an, dass die Datei vollständig ist, und nicht irgendwo abgeschnitten. Zudem könnte man danach/davor noch eine Prüfsumme anbringen (die könnte aber theoretisch auch einfach in den Header...).
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

AW: Records/Typen erkennen

  Alt 4. Mai 2012, 08:36
Moin!

Das mit der Prüfsumme ist eine gute Idee, zumal meine Daten auch über USB und WAN übertragen werden sollen. Das mit den Zufallszahlen ist okay, ich würde aber wegen besonderen Gegebenheiten doch lieber die Version mit den zwei Headern verwenden, also so wie es himitsu geschrieben hast. So war eigentlich auch meine Ursprungsidee.

Danke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz