在程序中,如何持久化一个自定义的对象 ( 积分: 100 )

  • 主题发起人 主题发起人 leeqii
  • 开始时间 开始时间
L

leeqii

Unregistered / Unconfirmed
GUEST, unregistred user!
开发一个项目需要实现这样的功能,当关闭程序时需要保存一个自定义的对象,在程序重新启动时再还原这个对象,哪位高手可以给个例子?
 
开发一个项目需要实现这样的功能,当关闭程序时需要保存一个自定义的对象,在程序重新启动时再还原这个对象,哪位高手可以给个例子?
 
1、使用流流化
2、参考TPersistent、TWriter、TReader
3、最简单做法就是把你的对象从TComponent继承下来,然后将你要保存的数据定义为published的property,利用TComponent的流化帮你保存
 
我的对象是从TOBject派生的该怎么办呢?
 
发错地方了

那就凑一下吧,我用的方法是TMemoryStream的SaveToFile,和LoadFromFile,但是有个问题就是,只能处理简单类型,不能处理类,所以就需要把类里面的内容自己在存取的时候拆分一下,最后保存,另外需要其他的一些技巧

下面是一个我参与的问题,里面有将对象写入数据库的例子,可以功参考
http://delphibbs.com/delphibbs/dispq.asp?lid=3110533
 
那就用TWriter和TReader去做吧
 
如果你嫌麻烦,而且能够接受,就直接将从TObject,改为从TComponent也不错
 
to Bruce.xm:
能否给个例子
 
如果是从TComponent继承下来的东西,可以直接用TStream的方法
function ReadComponent(Instance: TComponent): TComponent;
function ReadComponentRes(Instance: TComponent): TComponent;
procedure WriteComponent(Instance: TComponent);
procedure WriteComponentRes(const ResName: string
Instance: TComponent);
具体可以查看
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2421751

这个帖子非常好


如果是自己写的一个普通的类,可以考虑用我的方法
比如说有个类
TTest = class
private
nCount: Integer;
sName: string;
nWeight: double;
L: TList;
L1: TList;
public
constructor Create;
destructor Destroy
override;
procedure SaveToStream(var AStream: TMemoryStream);
procedure LaodFormStream(const AStream: TMemoryStream);
end;


procedure TTest.LaodFormStream(const AStream: TMemoryStream);
var
LCount: Integer;
I: Integer;
pt: TPt;
begin
if not Assigned(AStream) then Exit;
AStream.Position := 0;
AStream.ReadBuffer(nCount, sizeof(Integer));
AStream.ReadBuffer(Pointer(sName)^, sizeof(string));
AStream.ReadBuffer(nWeight, sizeof(double));
// 取链表
AStream.ReadBuffer(LCount, sizeof(LCount));
for I := L.Count - 1 downto 0 do TPt(L.Items).Free;
L.Clear;
for I := 0 to LCount - 1 do begin
pt := TPt.Create;
AStream.Read(pt.X, sizeof(double));
AStream.Read(pt.Y, sizeof(double));
AStream.Read(pt.Z, sizeof(double));
L.Add(pt);
end;
end;

procedure TTest.SaveToStream(var AStream: TMemoryStream);
var
I: Integer;
LCount: Integer;
pt: TPt;
begin
if not Assigned(AStream) then Exit;
AStream.Position := 0;
AStream.Write(nCount, sizeof(nCount));
AStream.Write(Pointer(sName)^, sizeof(sName));
AStream.Write(nWeight, sizeof(nWeight));
// 存链表
LCount := L.Count;
AStream.Write(LCount, sizeof(LCount));
for I := 0 to LCount - 1 do begin
pt := TPt(L.Items);
AStream.Write(pt.X, sizeof(double));
AStream.Write(pt.Y, sizeof(double));
AStream.Write(pt.Z, sizeof(double));
end;
AStream.SetSize(AStream.Position);
end;

然后通过这个Stream去LoadFromFile和SaveToFile,就可以把这个类的内容保存到文件里面去, http://delphibbs.com/delphibbs/dispq.asp?lid=3110533这个例子里面的东西是我存对象到数据库的例子,也是持久化对象了,几种数据类型基本上都考虑到了
 
后退
顶部