Delphi (win32) библиотеки сериализации

Есть ли какие-либо библиотеки сериализации Delphi, которые способны к сериализации записей и массивов записей вместо классов?

5
задан Max 6 June 2010 в 13:38
поделиться

3 ответа

@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;

Проверьте этот полный проект (проверен в Delphi 7)

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.
6
ответ дан 13 December 2019 в 05:31
поделиться

Если у вас есть Delphi 2010, вы можете взглянуть на DeHL. Он содержит библиотеку сериализации, которая может работать практически с любым типом данных.

3
ответ дан 13 December 2019 в 05:31
поделиться

Будучи рекордсменом, если у вас нет свойств, я не верю, что вы продвинулись дальше, пытаясь использовать какие-либо фреймворки персистентности (например, DeHL).

Принятый ответ, хотя и верный с технической точки зрения, является сомнительным для реальной утилиты и имеет множество сценариев долгосрочной поддержки и кошмара, если вы используете его в производственной среде. НЕ ДЕЛАЙТЕ ЭТО.

Если ваша программа представляет собой всего лишь немного ad-hoc'ery, могу я смиренно посоветовать вам раскачать ее в духе старой школы с «файлом записей», классической техникой Turbo Pascal, которая все еще работает.

0
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: