Das Problem beim Speichern eines Datensatzes, der ein dynamisches Array oder echte Zeichenketten (oder andere "verwaltete" Typen) enthält, ist, dass es sich nicht um einen großen Speicherblob handelt, der alles enthält, sondern eher um einen Baum. Irgendjemand oder irgendetwas muss alles durchgehen und irgendwie im Speicher ablegen. Andere Sprachen (z. B. Python) bieten alle möglichen Möglichkeiten, die meisten Objekte in Text umzuwandeln (serialisieren), auf der Festplatte zu speichern und wieder zu laden (deserialisieren).
Auch wenn es für Delphi keine von Embarcadero bereitgestellte Lösung gibt, kann eine solche mit der in Delphi 2010 verfügbaren erweiterten RTTI implementiert werden. Eine vorgefertigte Implementierung ist in der DeHL-Bibliothek verfügbar (hier ist ein Blogbeitrag darüber) - aber ich kann nicht viel über die Implementierung sagen, ich habe DeHL nie benutzt.
Eine andere Möglichkeit ist die, die Sie vermeiden wollen: die manuelle Serialisierung des Datensatzes in einen TStream; das ist eigentlich gar nicht so schwierig. Hier ist die Art von Code, die ich normalerweise zum Lesen/Schreiben von Objekten in einen Dateistrom verwende:
procedure SaveToFile(FileName:string);
var F:TFileStream;
W:TWriter;
i:Integer;
begin
F := TFileStream.Create(FileName, fmCreate);
try
W := TWriter.Create(F, 128);
try
// For every field that needs saving:
W.WriteString(SomeStr);
W.WriteInteger(TheNumber);
// Dynamic arrays? Save the length first, then save
// every item. The length is needed when reading.
W.WriteInteger(Length(DArray));
for i:=0 to High(DArray) do
W.WriteString(DArray[i]);
finally W.Free;
end;
finally F.Free;
end;
end;
procedure ReadFromFile(FileName:string);
var F:TFileStream;
R:TReader;
i,n:Integer;
begin
F := TFileStream.Create(FileName, fmOpenRead);
try
R := TReader.Create(F, 128);
try
SomeStr := R.ReadString;
TheNumber := R.ReadInteger;
// Reading the dynamic-array. We first get the length:
n := R.ReadInteger;
SetLength(DArray, n);
// And item-by-item
for i:=0 to n-1 do
DArray[i] := R.ReadString;
finally R.Free;
end;
finally F.Free;
end;
end;