AGB  ·  Datenschutz  ·  Impressum  







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

Objektproperties speichern?

Ein Thema von Antigo · begonnen am 12. Apr 2005 · letzter Beitrag vom 12. Apr 2005
Antwort Antwort
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#1

Objektproperties speichern?

  Alt 12. Apr 2005, 19:01
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
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#2

Re: Objektproperties speichern?

  Alt 12. Apr 2005, 19:46
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.
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#3

Re: Objektproperties speichern?

  Alt 12. Apr 2005, 19:52
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...
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Objektproperties speichern?

  Alt 12. Apr 2005, 19:56
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.
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#5

Re: Objektproperties speichern?

  Alt 12. Apr 2005, 20:03
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...
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#6

Re: Objektproperties speichern?

  Alt 12. Apr 2005, 20:21
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Objektproperties speichern?

  Alt 12. Apr 2005, 20:40
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;
  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 03:12 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