Delphi (win32) serialization libraries

前端 未结 4 1877
夕颜
夕颜 2020-12-09 23:10

Are there any Delphi serialization libraries that are capable of serializing records and arrays of records instead of classes?

4条回答
  •  春和景丽
    2020-12-10 00:06

    @Max you can use the TJvAppXMLFileStorage component from JEDI to serialize an record or an array of records.

    you can use the procedure called WriteBinary to store the data and ReadBinary to read.

    unfortunately there is not much documentation on this component, so here you have an very simple example for store a single record (for an array of records you can easily modify this source code).

    The record structure

    type
      MyRecord= record
          Field1 : Integer;
          Field2 : Double;
          Field3 : String[20];
          Field4 : String[20];
      end;
    

    Save an record

    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;
    

    this procedure create an XML file like this, the data is encoded in an hexadecimal format.

    
    
      84030000000000003333333333331F400D737472696E6720746573742031000000000000000D737472696E672074657374203200000000000000000000000000
    
    

    Read the persisted data

    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;
    

    Check this full project (tested in 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.
    

提交回复
热议问题