Есть ли какие-либо библиотеки сериализации Delphi, которые способны к сериализации записей и массивов записей вместо классов?
@Max Вы можете использовать компонент TJvAppXMLFileStorage из JEDI для сериализации записи или массива записей.
вы можете использовать процедуру под названием WriteBinary
для хранения данных и ReadBinary
для чтения.
К сожалению, документации по этому компоненту не так много, поэтому здесь приведен очень простой пример для хранения одной записи (для массива записей вы можете легко модифицировать этот исходный код).
type
MyRecord= record
Field1 : Integer;
Field2 : Double;
Field3 : String[20];
Field4 : String[20];
end;
Procedure SaveMyRecord(Rec : MyRecord);
var
MyStore: TJvAppXMLFileStorage;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\temp\record.xml';
//this component supports store multiples objects to the same file, so you need use an identifier for you particular object, in this case i'm use the Dummy name.
MyStore.WriteBinary('Dummy', @Rec,sizeof(Rec));
MyStore.Xml.SaveToFile(MyStore.FileName);
finally
MyStore.Free;
end;
end;
эта процедура создает XML файл, как показано здесь, данные закодированы в шестнадцатеричном формате.
<?xml version="1.0" encoding="iso-8859-1"?>
<Configuration>
<Dummy>84030000000000003333333333331F400D737472696E6720746573742031000000000000000D737472696E672074657374203200000000000000000000000000</Dummy>
</Configuration>
Procedure LoadMyRecord(var Rec : MyRecord);
var
MyStore: TJvAppXMLFileStorage;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\temp\record.xml';//point to the same file
MyStore.Xml.LoadFromFile(MyStore.FileName); //load the file
MyStore.ReadBinary('Dummy', @Rec,sizeof(Rec));//use the Dummy identifier and pass the record as an pointer
finally
MyStore.Free;
end;
end;
program ProjectPersistRecord;
{$APPTYPE CONSOLE}
uses
SysUtils,
JvAppXMLStorage;
type
MyRecord= record
Field1 : Integer;
Field2 : Double;
Field3 : String[20];
Field4 : String[20];
end;
Procedure SaveMyRecord(Rec : MyRecord);
var
MyStore: TJvAppXMLFileStorage;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\temp\record.xml';
MyStore.WriteBinary('Dummy', @Rec,sizeof(Rec));
MyStore.Xml.SaveToFile(MyStore.FileName);
finally
MyStore.Free;
end;
end;
Procedure LoadMyRecord(var Rec : MyRecord);
var
MyStore: TJvAppXMLFileStorage;
begin
MyStore:= TJvAppXMLFileStorage.Create(nil);
try
MyStore.FileName:='C:\temp\record.xml';
MyStore.Xml.LoadFromFile(MyStore.FileName);
MyStore.ReadBinary('Dummy', @Rec,sizeof(Rec));
finally
MyStore.Free;
end;
end;
Var
Rec : MyRecord;
begin
//Fill the record
Rec.Field1:=900;
Rec.Field2:=7.8;
Rec.Field3:='string test 1';
Rec.Field4:='string test 2';
SaveMyRecord(Rec); //save the record
FillChar(Rec,SizeOf(Rec),#0); //clear the record variable
LoadMyRecord(Rec);//restire the record data
//show the loaded data
Writeln(rec.field1);
Writeln(rec.field2);
Writeln(rec.field3);
Writeln(rec.field4);
Readln;
end.
Если у вас есть Delphi 2010, вы можете взглянуть на DeHL. Он содержит библиотеку сериализации, которая может работать практически с любым типом данных.
Будучи рекордсменом, если у вас нет свойств, я не верю, что вы продвинулись дальше, пытаясь использовать какие-либо фреймворки персистентности (например, DeHL).
Принятый ответ, хотя и верный с технической точки зрения, является сомнительным для реальной утилиты и имеет множество сценариев долгосрочной поддержки и кошмара, если вы используете его в производственной среде. НЕ ДЕЛАЙТЕ ЭТО.
Если ваша программа представляет собой всего лишь немного ad-hoc'ery, могу я смиренно посоветовать вам раскачать ее в духе старой школы с «файлом записей», классической техникой Turbo Pascal, которая все еще работает.