Delphi语言如何对自定义类进行持久化保存及恢复 (性能远比json/xml高)
来源:互联网 发布:vscode搭建go开发环境 编辑:程序博客网 时间:2024/05/16 18:03
Delphi的RTL自身就带有一套很好的资源持久化保存(IDE设计窗体时,保存为DFM格式及编译到EXE里面的资源文件)及恢复机制(EXE启动时对窗体资源的加载),那么应没必要再额外用xml/json格式保存程序的参数了,我们大可以将参数集中在一个参数类里面,然后通过这套机制进行保存及恢复。
由于我们的参数类型可能五花八门,除了传统的整数、小数、字符串、true/false、还有可能是数组、列表、枚举等,则需要override DefineProperties这个函数来自定义属性的保存及恢复。
废话少说,给出代码,此代码演示了如何自定义数据的保存及恢复、以及保存整个Form:
unit Unit1;interfaceuses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;type TArrayOfInteger = array of integer; TSetting = class(TComponent) privatefIntVal: integer;fIntArr: TArrayOfInteger;procedure ReadIntArr(Reader: TReader);procedure WriteIntArr(Writer: TWriter); protectedprocedure DefineProperties(Filer: TFiler); override; publicproperty intArr: TArrayOfInteger read fIntArr write fIntArr; publishedproperty intval: integer read fIntVal write fIntVal; end; TForm1 = class(TForm)btnCloneClass: TButton;mmo1: TMemo;btnCloneForm: TButton;procedure btnCloneClassClick(Sender: TObject);procedure btnCloneFormClick(Sender: TObject); private{ Private declarations } public{ Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}{ TSetting }procedure TSetting.DefineProperties(Filer: TFiler);begin inherited; Filer.DefineProperty('intArr', ReadIntArr, WriteIntArr, true);end;procedure TSetting.ReadIntArr(Reader: TReader);var lvIdx: integer;begin fIntArr := nil; Reader.ReadListBegin; SetLength(fIntArr,Reader.ReadInteger); lvIdx:=low(fIntArr); while not Reader.EndOfList do beginfIntArr[lvIdx] := Reader.ReadInteger;inc(lvIdx); end; Reader.ReadListEnd;end;procedure TSetting.WriteIntArr(Writer: TWriter);var i: integer;begin Writer.WriteListBegin; Writer.WriteInteger(integer(Length(fIntArr))); for i := Low(fIntArr) to High(fIntArr) do beginWriter.WriteInteger(fIntArr[i]); end; Writer.WriteListEnd;end;function ClassToStr(pvClass: TComponent): ansiString;var inStream, outStream: TMemoryStream;begin inStream := TMemoryStream.Create; outStream := TMemoryStream.Create; tryinStream.WriteComponentRes(pvClass.ClassName, pvClass);// inStream.WriteComponent(pvClass);inStream.Position := 0;ObjectResourceToText(inStream, outStream);// ObjectBinaryToText(inStream,outStream);outStream.Position := 0;SetLength(Result, outStream.Size + 1);FillChar(Result[1], outStream.Size + 1, 0);outStream.ReadBuffer(Result[1], outStream.Size); finallyFreeAndNil(inStream);FreeAndNil(outStream); end;end;function StrToClass(pvStr: ansiString; pvCmpToSetProperties: TComponent=nil): TComponent;var inStream, outStream: TMemoryStream;begin inStream := TMemoryStream.Create; outStream := TMemoryStream.Create; tryif (pvStr <> '') then inStream.WriteBuffer(pvStr[1], length(pvStr));inStream.Position := 0;ObjectTextToResource(inStream, outStream);// ObjectTextToBinary(inStream,outStream);outStream.Position := 0;Result := outStream.ReadComponentRes(pvCmpToSetProperties); finallyFreeAndNil(inStream);FreeAndNil(outStream); end;end;procedure TForm1.btnCloneClassClick(Sender: TObject);var lvObj, lv1: TSetting; lvStr: String; lvArr: TArrayOfInteger;begin lvObj := TSetting.Create(nil); trylvObj.intval := 12345;SetLength(lvArr, 3);lvArr[0] := 222;lvArr[1] := 333;lvArr[2] := 444;lvObj.intArr := lvArr;lvStr := ClassToStr(lvObj);RegisterClass(TSetting);lvObj.intval := 1;lv1 := TSetting(StrToClass(lvStr, nil));if (lv1.intval > lvObj.intval) then mmo1.Text := lvStr; finallyFreeAndNil(lvObj);FreeAndNil(lv1); end; // WriteComponentResFile(ExtractFilePath(ParamStr(0))+ 'd.res',self);end;procedure TForm1.btnCloneFormClick(Sender: TObject);var lvNewForm:TForm1;lvRes:string;begin lvRes:=ClassToStr(self); RegisterClass(TForm1); lvNewForm:=TForm1.CreateNew(application); StrToClass(lvRes,lvNewForm); lvNewForm.Left:=self.Left+50; lvNewForm.Top:=self.Top+50;end;end.
0 0
- Delphi语言如何对自定义类进行持久化保存及恢复 (性能远比json/xml高)
- JSON性能比对
- Android 自定义组件及组件如何保存/恢复状态
- Delphi实现类的持久化保存(DFM格式)
- Redis持久化机制比对
- delphi中对树进行自定义排序
- 在Android中使用比JSON性能高的FlatBuffers
- 利用JDOM及XPath对XML文件进行创建、查找、增加、删除、保存等操作
- 高性能Java持久化的技巧
- 数据持久化(保存Json文件)---Newtonsoft Json
- 关于java json转换工具性能比对
- IOS——使用keychain对数据进行持久化保存(删除APP不影响数据)
- redis持久化之RDB、AOF机制比对
- Json数据结构比对
- 如何对json代码进行格式化显示
- 数据持久化(保存Json文件)---SimpleJson
- 如何对自定义类进行归档,写入plist文件
- 对XML及Json数据的操作
- java常量池技术
- JAVA日期类型
- Linux 概念架构的理解
- POJ 2236 Wireless Network(并查集)
- Java Set
- Delphi语言如何对自定义类进行持久化保存及恢复 (性能远比json/xml高)
- static 关键字的作用
- angular入门学习之五
- [Android]使用Gradle提交自己开源Android库到Maven中心库
- 容纳40位数的n!值
- 机器学习大牛们的博客
- hdu 2082 找单词
- 在java中怎样获得当前日期时间
- PDF文件怎么阅读和编辑