将 TObject 保存到文件

问题描述 投票:0回答:7

如何将当前状态的对象保存到文件中?这样就可以立即读取并恢复它的所有变量。

delphi object save delphi-7
7个回答
4
投票

您正在寻找的称为对象持久性。这篇文章可能会有所帮助,如果你用谷歌搜索“delphi持久对象”,还有很多其他文章。


3
投票

如果您从 TComponent 继承对象,则可以使用一些内置功能将对象流式传输到文件。我认为这只适用于简单的物体。

一些帮助您入门的示例代码:

unit Unit1;

interface

uses
  Classes;

type
  TMyClass = class(TComponent)
  private
    FMyInteger: integer;
    FMyBool: boolean;
    FMyString: string;
  public
    procedure ToFile(AFileName: string);
  published
    property MyInteger: integer read FMyInteger write FMyInteger;
    property MyString: string read FMyString write FMyString;
    property MyBool: boolean read FMyBool write FMyBool;
  end;

implementation

{ TMyClass }

procedure TMyClass.ToFile(AFileName: string);
var
  MyStream: TFileStream;
begin
  MyStream := TFileStream.Create(AFileName);
  try
    Mystream.WriteComponent(Self);
  finally
    MyStream.Free;
  end;
end;

end.

3
投票

如前所述,最简单的方法是使用 Stream 及其 WriteComponentReadComponent 方法。
请注意
- 它适用于 TComponent 的后代,而不是普通的 TObject;
- 仅适用于已发布的属性(保存在 dfm 中的属性),而不是公共属性或(更不用说)私有属性; - 恢复组件时必须特别注意Name属性
您可能会在这些答案中找到一些可以使用的代码:

在 Delphi 中运行时替换可视组件

在运行时复制组件


2
投票
XML 方法


2
投票

解决方案 2. 将对象保存到二进制文件(我的首选解决方案)。相信我,这并不难。 使用 ccStreamMem.pas,或者更好的是我的

LightSaber Core 库

中的 ccStreamBuff.pas(缓冲写入)。 您可以在 Delphi in all its pleasure
书中找到一些关于如何做到这一点的代码示例。 PS:LightSaber 是 JVCL 的轻量级替代品。
以下是如何将记录保存到二进制文件的示例。操作与 TObject 相同!

// Supposing you have a record (could be also an object) called RAnimationParams that you want to save to disk: INTERFACE USES System.SysUtils, Vcl.Graphics, ccStreamBuff; TYPE TFrameDelayType = (fdAuto, fdUser); RAnimationParams = record Color : TColor; DelayType : TFrameDelayType; procedure WriteToStream (IOStream: TCubicBuffStream); procedure ReadFromStream(IOStream: TCubicBuffStream); end; IMPLEMENTATION procedure RAnimationParams.WriteToStream(IOStream: TCubicBuffStream); begin IOStream.WriteByte (Ord(DelayType)); IOStream.WriteInteger (Color); IOStream.WritePadding (32); end; procedure RAnimationParams.ReadFromStream(IOStream: TCubicBuffStream); begin DelayType := TFrameDelayType(IOStream.ReadByte); Color := IOStream.ReadInteger; IOStream.ReadPadding (32); end;

末尾的填充允许您稍后更改记录/对象结构,而无需更改二进制文件的格式。

要将 RAnimationParams 实际保存到磁盘,您只需执行以下操作:

MyBinFile:= TCubicBuffStream.CreateRead('C:\Test.bin'); AnimationParams.WriteToStream(MyBinFile); MyBinFile.Free;

当您想要从 Test.bin 加载 RAnimationParams 时使用相同的代码,但您使用 CreateWrite 而不是 CreateRead。

TCubicBuffStream 类甚至具有 ReadHeader/CreateWrite 等专用函数,可让您轻松地将“

文件幻数

”和“文件版本号”添加到二进制文件中。 看到了吗?没那么难。它适用于任何对象,而不仅仅是 TComponent。

JVCL 的示例,但它不适用于 TObject,而仅适用于持久派生:

uses JvAppXMLStorage; var Storage: TJvAppXMLFileStorage; begin Storage := TJvAppXMLFileStorage.Create(nil); try Storage.WritePersistent('', MyObject); Storage.Xml.SaveToFile('S:\TestFiles\Test.xml'); Storage.Xml.LoadFromFile('S:\TestFiles\Test.xml'); Storage.ReadPersistent('', MyObject); finally Storage.Free; end; end;



1
投票
这里有一个很好的教程

。请记住,您必须具有 RTTI(运行时类型信息)才能使用此方法在运行时保存对象,因此它只会捕获类的 published 属性。


-1
投票
http://www.deepsoftware.ru/rsllib/index.html

这不是火箭科学,但如果你做了很多这样的事情,这个组件为其提供了一个很好的框架。 Developer Express 还包含一个通用 cxPropertiesStore 组件,作为 ExpressEditors 库的一部分,该库随其某些组件一起提供。

© www.soinside.com 2019 - 2024. All rights reserved.