解决方案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;
7条答案
按热度按时间clj7thdc1#
内置的对象持久性主要是为将组件流到dfm而设计的,你需要做的持久化你的草图的工作不会从这种机制中受益很多。
我认为你最好想出一个定制的方案。
iswrvxsc2#
我过去使用的一种方法是将对象属性存储在XML文件中,编写一个自定义的“保存”例程,该例程添加到传递的IXMLNode中,并编写一个新的构造函数,该构造函数从传递的IXMLNode中读取。我将组件存储为节点,将属性存储为属性(除非属性是另一个对象,否则它将是一个子节点)。
我相信在 Delphi Jedi项目中有一些例程可以为您处理组件流,但我没有直接使用它们,因为我的大多数XML流都是手工完成的,因为我的对象非常简单,只需要少数属性就可以呈现。
kuuvgm7e3#
我使用TI对象持久性框架(tiopf.com)。我在http://tiopf.sourceforge.net/Doc/overview/index.shtml上写了概述。
它可以让你保存对象和列表到xml,csv,数据库等。它自动处理子对象。
如果你感兴趣,请使用svn版本,而不是sourceforge下载,因为它有更多的功能(包括部分D 2009支持).
nnvyjq4y4#
你也可以用著名的hibernate从java中知道。
你可以在这里找到 Delphi port:dHibernate
wlp8pajw5#
JSON是一种新的非常紧凑的存储对象的方法。 Delphi 有两个库:SuperObject和lkJSON。
ac1kyiln6#
使用来自http://www.simdesign.nl/xml.html的NativeXML,我完成了从XML代码读取/写入 Delphi 内存中的对象。非常好,非常简单,这里包括演示:http://www.simdesign.nl/forum/download/file.php?id=236
ukqbszuj7#
解决方案1.您可以使用JVCL TJvAppXMLFileStorage。但JVCL是巨大的!你要不要考虑一下,拖着这么大一个依赖,一辈子。
解决方案2.保存你的对象到一个二进制文件(我的首选解决方案)。相信我,没那么难。在我的LightSaber Core library中使用ccStreamMem.pas,或者更好的ccStreamBuff.pas(缓冲写入)。
在Delphi in all its glory书中有一些关于如何做到这一点的代码示例。
PS:LightSaber是JVCL的轻量级替代品。
下面是一个如何将记录保存到二进制文件的示例。操作与TObject相同!
结尾处的填充允许您稍后更改记录/对象结构,而无需更改二进制文件的格式。
要将RAnimationParams实际保存到磁盘,您只需执行以下操作:
当你想从Test.bin中加载RAnimationParams时,代码是一样的,但是你使用的是写而不是读。
TCubicBuffStream类甚至有专门的函数,如ReadHeader/ReadWrite,允许您轻松地向二进制文件添加“文件魔法号”和“文件版本号”。
看到没那么难它将适用于任何对象,而不仅仅是TComponent。