Einzelnen Beitrag anzeigen

Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#7

Re: Dynamische Struktur in Typisierter Datei speichern?

  Alt 31. Mär 2008, 01:55
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: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.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat