Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamische Struktur in Typisierter Datei speichern? (https://www.delphipraxis.net/111136-dynamische-struktur-typisierter-datei-speichern.html)

draxo 30. Mär 2008 12:54


Dynamische Struktur in Typisierter Datei speichern?
 
Hallo,

ich habe eine Frage zur typisierten Datei! Ich habe einen "Dateityp" erstellt, der neben ein paar Strings auch 3 Listen enthält. Kann ich diesen Typ "einfach" speichern? Ich hätte dann im Prinzip in der Datei ja nur einen Datensatz. Nach meinen bisherigen Versuchen habe ich die Vermutung, dass ich diese Liste nicht einfach abspeichern kann. Ist dies der Fall? Wenn ja, wie kann ich denn die Listen in der typisierten Datei unterbrigen? Ich kenne das Speichern dynamischer Strukturen nur von Java, hier kann man Objekte speichern. Ich hoffe, dass es in Delphi - auch wenn man das nicht ganz verlgeichen kann - möglich ist, Listen zu speichern.

Bin für jedne Tip dankbar :)

mkinzler 30. Mär 2008 12:56

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Geht nicht so einfach, weil ja die Option der typisierten Datei nicht möglich ist. Man müsste also XML heranziehen.

draxo 30. Mär 2008 12:59

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Und damit geht es? Du hast nicht zufällig einen Link mit einem Beispiel :) ?

grenzgaenger 30. Mär 2008 18:07

Re: Dynamische Struktur in Typisierter Datei speichern?
 
ja, du kannst auch in delphi objekte serialisieren (seit TP 5.5). konnte delphi also schon vor java ... ;-)

verwendet wird das serialiseren allerdings selten, und noch selterner objektororientierte datenbanken.

der standardweg ist über die normalisierung und dann ab in die zugehörigen tabellen. allternativ kannst du das auch mit 'n flatfile machen und verschiedenen satzarten (oh grauss, wie in den 60'ern)

<HTH> GG

Jens Schumann 30. Mär 2008 18:48

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Hallo,
das ist der klassische Fall für die dpCollection

sx2008 30. Mär 2008 20:28

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Zitat:

Zitat von draxo
Ich kenne das Speichern dynamischer Strukturen nur von Java, hier kann man Objekte speichern. Ich hoffe, dass es in Delphi - auch wenn man das nicht ganz verlgeichen kann - möglich ist, Listen zu speichern.

Wenn du Java kennst, dann kennst du wohl auch JSON ?
Es gibt auch Delphi Units für JSON, um komplexe Datenstrukturen zu laden und zu speichern.
Diese typisierten Dateien von Pascal sind eine üble Altlast, die man sich nicht antuen sollte.
Du hast bei hierarchischen Daten die Wahl zwischen 3 Formaten:
XML , JSON und das Delphi eigene Objektformat(*) wie es über dpCollection verwendest wird

*) alle Formulare sind in diesem Format gespeichert; gibt's als Binär- und Text-Version

Panthrax 31. Mär 2008 00:55

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Ich bin JSON-Neuling und habe mir gerade mal die Unit JSON näher angesehen angesehen. - Ich bin enttäuscht. Bei JSON geht es nicht darum Objekte zu serialisieren, sondern ein bestimmtes Format auszugeben und einzulesen. Alle zu speichernden Werte müssen zunächst separat an die "JSON-Objekte" übergeben werden. Diese kümmern sich dann "nur" darum, das JSON-Format auszugeben und einzulesen. Im Quelltext sieht das dann so aus:

Auszug aus der Unit JSON_Usage:
Delphi-Quellcode:
    my_object := TJsonObject.Create(json_type_object);
    with my_object.AsObject do
    begin
      Put('abc', TJsonObject.Create(12));
      Put('foo', TJsonObject.Create('bar'));
      Put('bool0', TJsonObject.Create(false));
      Put('bool1', TJsonObject.Create(true));
      Put('baz', TJsonObject.Create('bang'));
      Put('baz', TJsonObject.Create('fark'));
      Delete('baz');
      my_array.AddRef; // i will destroy it myself
      Put('arr', my_array);
    end;
    writeln('my_object=');
    if JsonFindFirst(my_object, ite) then
    repeat
      writeln(#9,ite.key,': ', ite.val.AsJson);
    until not JsonFindNext(ite);
    JsonFindClose(ite);
    writeln('my_object.AsJson=', my_object.AsJson);
Gerade selbsterklärend ist das nicht.

Im Vergleich dazu können beim Delphi-Streaming Komponenten einfach gespeichert werden:
Delphi-Quellcode:
Stream.WriteComponent(Component);
Beide Systeme haben ihre ganz eigenen Beschränkungen. Funktional bietet JSON gegenüber dem Delphi-Streaming jedoch keinen Vorteil, wenn es auf das Format nicht ankommt. Im Gegenteil: Die Typenlosigkeit (keine Typinformationen in den gespeicherten Daten) sehe ich als Manko in vielerlei Hinsicht. Mit dem Delphi-Streaming im Binärformat ließe sich die Eingangsfrage problemlos beantworten (Stichworte: TPersistent- und TComponent-Nachfahren, Published-Eigenschaften, TPersistent.DefineProperties, TReader und TWriter, TStream.WriteComponent und .ReadComponent). Leider sind die Funktionen ObjectBinaryToText (und entsprechend ObjectTextToBinary) nicht in der Lage mit selbsteingebrachten Eigenschaftswerten (DefineProperties) umzugehen. Kurz gesagt: Ein Text-Format dieser Werte ist mit Delphi-Boardmitteln dann nicht mehr möglich (was gerade mein Problem ist (#864216)). Leider kenne ich bisher kein System, welches dazu in der Lage wäre eine Objektliste (oder Komponentenliste) zu speichern und zu laden. Das muss man eben immernoch zu Fuß machen... Bei XML sieht das soweit nicht anders aus. Und für die DPCollection gilt dasselbe wie für das Delphi-Streaming auch, da sie die Delphi-Boardmittel nur kapselt.

sx2008 31. Mär 2008 13:07

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Zitat:

Zitat von Panthrax
... geht es nicht darum Objekte zu serialisieren, sondern ein bestimmtes Format auszugeben und einzulesen...

Ja leider ist das Serialisierungssystem von Delphi ziemlich schwach bzw. unzureichend.
Schade, das ist ein Kernthema jeder höheren Programmiersprache.
Da hat wohl auch damit zu tun, dass (COM-)Interfaces erst später Eingang in Delphi gefunden haben.
In .NET und Java wurde das viel besser gelöst.
Es wird wohl nichts anderes übrig bleiben, als jedes Objekt und jedes Property von Hand zu spichern und zu laden. :-(
Man kann jedes Property,das als published deklariert wurde über die RTTI (Unit TypeInfo) abfragen und setzen, aber das erfordert doch relativ viel Aufwand.

Panthrax 31. Mär 2008 13:14

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Zitat:

Zitat von sx2008
Zitat:

Zitat von Panthrax
... geht es nicht darum Objekte zu serialisieren, sondern ein bestimmtes Format auszugeben und einzulesen...

Ja leider ist das Serialisierungssystem von Delphi ziemlich schwach bzw. unzureichend.

Ohne noch einmal genauer darauf einzugehen, aber bitte nicht aus dem Kontext reißen:
Zitat:

Zitat von Panthrax
Bei JSON geht es nicht darum Objekte zu serialisieren, sondern ein bestimmtes Format auszugeben und einzulesen...


draxo 31. Mär 2008 13:17

Re: Dynamische Struktur in Typisierter Datei speichern?
 
Vielen Dank für die ganzen Antworten hier. Aber für meine kleine Anwendung ist das glaube ich ein zu großer Aufwand.
Ich nehme es in Kauf ein wenig redundante Daten zu haben, dafür geht es recht schnell :)


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