Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objektproperties speichern? (https://www.delphipraxis.net/44054-objektproperties-speichern.html)

Antigo 12. Apr 2005 18:01


Objektproperties speichern?
 
Hi,
ich bin immer noch an meinem ersten "richtigen" OO Programm dran. Jetzt bin ich soweit das ich zur Programmlaufzeit Daten in meinem Objekt speichere. Nur möchte ich diese natürlich nach einem Programmstart wieder benutzen. Also muss ich meinem Objekt jetzt beibringen wie es sich selbst speichert und natürlich auch wieder lädt.

Ich hab ein wenig hier im Forum gesucht und hab etwas mit FilsStream gefunden, wo jemandem geraten wurde das komplette Objekt einfach zu speichern.
Zitat:

Delphi-Quellcode:
tmpObj := myObjectList.myObjects[count];
Stream.Write(SizeOf(tmpObj),sizeof(integer));
Stream.Write(tmpObj,SizeOf(tmpObj));

Nun meine Frage: geht das wirklich so einfach? Und ich möchte ja nur die Inhalte der Propertys speichern, nichts weiter. Ist das dafür das richtige?


schonmal danke im vorraus :)

bttb930 12. Apr 2005 18:46

Re: Objektproperties speichern?
 
ob's wirklich so einfach geht solltest du vielleicht durch ausprobieren feststellen. aber ich glaube schon.

allerdings würde ich es eher nicht so machen, sondern stattdessen lieber alle properties direkt speichern. beispielsweise in einer datenbank.

normalerweise macht das objekt das auch nicht selbst, sondern es gibt ein zweites objekt, das das übernimmt. man kann dann nämlich auf verschiedene arten speichern und für jede speicherart eine eigene klasse programmieren.

Antigo 12. Apr 2005 18:52

Re: Objektproperties speichern?
 
naja ich habe nicht vor riesige Datenmengen zu speichern, von daher sind für mich sowohl Datenbanken als auch verschiedene Speichermethoden überdimensioniert und unnötig.
Ich werd dann mal versuchen ob ich das ganze so gespeichert bekomme. Die Frage ist dann natürlich inwiefern man die Daten dann später einlesen kann wenn sich an der Objekt Struktur mal etwas verändert hatt...

marabu 12. Apr 2005 18:56

Re: Objektproperties speichern?
 
Es gibt viele Möglichkeiten ein Objekt persistent zu machen, z.B.
  • Konfigurations-Datei (.ini)
  • Binär-Datei
  • Datenbank (SQL, LDAP)
Du scheinst dich gerade an der zweiten Variante zu versuchen. Spendiere deiner Klasse die Methoden Load und Save. Darin kannst Du dann die property values in den stream schreiben und wieder einlesen. Wenn du mehrere Objekte in derselben Datei persistent machen willst, dann nenne die Methoden LoadFromStream(s: TStream) und SaveToStream(s: TStream). Der Vorteil dieser Methode ist die Geschwindigkeit - es wird kein Parser benötigt, das Objekt weiss, was in welcher Reihenfolge gespeichert und geladen wird. Der Nachteil ist, wie du richtig vermutest, dass jede neue Version deiner Klasse die alten Speicherstrukturen migrieren können muss.

Kleinere Datenmengen, die nur zu Beginn und am Ende deiner Arbeit transferiert werden, kannst Du getrost in einer Konfigurationsdatei ablegen. Die hat den Vorteil, dass sie human readable ist.

Werden deine property values häufig und von mehreren Instanzen deines Programms transferiert, dann kommst du wegen der notwendigen Zugriffskontrolle nicht um eine Datenbank herum.

Der von dir angegebene Quellcode macht nicht viel Sinn, aber das hast du vielleicht schon selbst bemerkt.

Antigo 12. Apr 2005 19:03

Re: Objektproperties speichern?
 
hmm ja der Quellcode war auch nur eins zu eins aus einem anderen Thread kopiert wo das selbe Thema angesprochen wurde.

Also es ist so das ich zur Laufzeit nur eine einzige Instanz des Objektes benutze. Dem Objekt wollte ich genau wie du es gesagt hats eine Save und eine Load Methode spendieren.
Ich denke mal für eine .ini Datei habe ich zu viele Daten, hab aber noch nie damit gearbeitet. Für eine Datenbank aber zu wenige.
Bisher hatte ich das ganze simpel mit einem record gelöst, was wirklich einfach war, wobei man da natürlich das selbe Problem hat, nämlich das bei einer Erweiterung der Datenstruktur die alten Datensätze nicht mehr so einfach lesbar sind.

Aber ich werd es wohl jetzt so machen das ich die einzelnen propertys in einen Strean schreibe. Allerdings hat mein Objekt ein dynamisches Array, und da ich auch noch nie mit Streans gearbeitet habe und nur ein einziges vernünftiges Tutorial finden konnte bin ich ein wenig aufgeschmissen...

bttb930 12. Apr 2005 19:21

Re: Objektproperties speichern?
 
wieso gleich aufgeben nur weil kein tutorial gefunden? probier's halt mal. die probleme kommen soundso erst dann, wenn du das objekt um neue properties erweiterst - dann wirst du dir wünschen, dass du das save und load doch per ini-datei gelöst hättest und nicht per stream.

marabu 12. Apr 2005 19:40

Re: Objektproperties speichern?
 
Kleine Starthilfe, ohne Gewähr.

Delphi-Quellcode:
const
  MyObjectFile = 'myobject.dat';

type
  TMyObject = class(TObject)
    FDynArray: array of integer;
    constructor Create(len: integer);
    destructor Destroy; override;
    procedure Load; virtual;
    procedure Save; virtual;
  end;

constructor TMyObject.Create(len: integer);
var
  i: integer;
begin
  inherited Create;
  SetLength(FDynArray, len);
  for i := 0 to len - 1 do
    FDynArray[i] := Random(100);
end;

destructor TMyObject.Destroy;
begin
  FDynArray := nil;
  inherited;
end;

procedure TMyObject.Load;
var
  s: TFileStream;
  i: integer;
begin
  s := TFileStream.Create(MyObjectFile, fmOpenRead, fmShareDenyWrite);
  for i := Low(FDynArray) to High(FDynArray) do
    s.Read(FDynArray[i], SizeOf(integer));
  s.Free;
end;

procedure TMyObject.Save;
var
  s: TFileStream;
  i: integer;
begin
  s := TFileStream.Create(MyObjectFile, fmCreate, fmShareDenyWrite);
  for i := Low(FDynArray) to High(FDynArray) do
    s.Write(FDynArray[i], SizeOf(integer));
  s.Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 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