Delphi 对象持久化的最好方法是什么

3qpi33ja  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(116)

我已经开发了应用程序绘制一些形状(主要是线条),现在我需要能够存储草图到一个文件中,我知道 Delphi 已经建立了对象持久性例程,但我从来没有使用过它。
有人能告诉我,如果我必须持久化也引用其他对象的对象(将被存储到),我有TLine对象可以连接到其他TLine对象等,可以使用对象持久化吗?
使用此功能或编写自定义过程来存储/读取对象到/从文件中更好。

clj7thdc

clj7thdc1#

内置的对象持久性主要是为将组件流到dfm而设计的,你需要做的持久化你的草图的工作不会从这种机制中受益很多。
我认为你最好想出一个定制的方案。

iswrvxsc

iswrvxsc2#

我过去使用的一种方法是将对象属性存储在XML文件中,编写一个自定义的“保存”例程,该例程添加到传递的IXMLNode中,并编写一个新的构造函数,该构造函数从传递的IXMLNode中读取。我将组件存储为节点,将属性存储为属性(除非属性是另一个对象,否则它将是一个子节点)。
我相信在 Delphi Jedi项目中有一些例程可以为您处理组件流,但我没有直接使用它们,因为我的大多数XML流都是手工完成的,因为我的对象非常简单,只需要少数属性就可以呈现。

kuuvgm7e

kuuvgm7e3#

我使用TI对象持久性框架(tiopf.com)。我在http://tiopf.sourceforge.net/Doc/overview/index.shtml上写了概述。
它可以让你保存对象和列表到xml,csv,数据库等。它自动处理子对象。
如果你感兴趣,请使用svn版本,而不是sourceforge下载,因为它有更多的功能(包括部分D 2009支持).

nnvyjq4y

nnvyjq4y4#

你也可以用著名的hibernate从java中知道。
你可以在这里找到 Delphi port:dHibernate

wlp8pajw

wlp8pajw5#

JSON是一种新的非常紧凑的存储对象的方法。 Delphi 有两个库:SuperObjectlkJSON

ac1kyiln

ac1kyiln6#

使用来自http://www.simdesign.nl/xml.html的NativeXML,我完成了从XML代码读取/写入 Delphi 内存中的对象。非常好,非常简单,这里包括演示:http://www.simdesign.nl/forum/download/file.php?id=236

ukqbszuj

ukqbszuj7#

解决方案1.您可以使用JVCL TJvAppXMLFileStorage。但JVCL是巨大的!你要不要考虑一下,拖着这么大一个依赖,一辈子。
解决方案2.保存你的对象到一个二进制文件(我的首选解决方案)。相信我,没那么难。在我的LightSaber Core library中使用ccStreamMem.pas,或者更好的ccStreamBuff.pas(缓冲写入)。
Delphi in all its glory书中有一些关于如何做到这一点的代码示例。
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时,代码是一样的,但是你使用的是写而不是读。
TCubicBuffStream类甚至有专门的函数,如ReadHeader/ReadWrite,允许您轻松地向二进制文件添加“文件魔法号”和“文件版本号”。
看到没那么难它将适用于任何对象,而不仅仅是TComponent。

相关问题