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.