如何保存对象到文件 type myclass = class arr:array[0..63] of Tpoint; str:string; int:integer; end;把自己创建的类实例化的对象 保存到文件中,需要可用代码。 在线等,马上给分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 procedure TForm1.Button1Click(Sender: TObject);varaa:myclass;mm:TMemorystream;beginaa:=myclass.Create;mm:=TMemoryStream.Create;mm.WriteBuffer(aa,sizeof(aa));mm.SaveToFile('1.dat');mm.Free;aa.Free;end; 我就是想把某个对象序列化保存到文件中,使用时在load进来,这个对象里面结构包含数组,包含tpoint等对象,java和.net 都有现成的方法,谁知道delphi里怎么用? to : hys_427 请问保存文件类型是任意的吧?读的方法呢? procedure TForm1.Button2Click(Sender: TObject); var aa:myclass; mm:TMemorystream; begin aa:=myclass.Create; mm:=TMemoryStream.Create; mm.LoadFromFile('1.dat'); mm.ReadBuffer(aa,sizeof(aa)); mm.Free; aa.Free; end; to : hys_427 其实用TMemoryStream的方法我也查到了,但是不行啊! 读不出来的,貌似保存的只是地址,内容没存进去 aa.InstanceSize 不行! 还是读不出来 我的意思是,用hys_427的代码,只是sizeof(aa)改成aa.InstanceSizesizeof(aa)只有4字节,是一个指针的长度 delphi不行的必须要自己实现,如果是Class 则需要一个变量一个变量的写文件,读的时候也一样,先创建实例在赋值。 如果只是普通的数据类型的话,可以把属性放到published域,然后利用RTTI来保存并读取 mm.ReadBuffer(aa,sizeof(aa)); 这个保存当然是地址咯你需要把所有的属性信息保存到文件中下面是我原来写过的代码,你可以参考一下,另外 对于 SaveToStream,LoadFromStream你可以另外封装为SaveToFile,LoadFromFile,这个应该很简单咯 TPerson = class private FPersonIndex : cPersonHeader; FPrivateBasic : cPrivateBasic; FLocation : cLocation; FEduCount : Integer; FEducations : TEducationList; FExpCount : Integer; FExperiences : TExperienceList; FContacts : cContacts; FBasic: cPrivateBasic; protected public constructor Create(); destructor Destroy(); property PersonIndex : cPersonHeader read FPersonIndex write FPersonIndex; property Basic : cPrivateBasic read FBasic write FBasic; property Location : cLocation read FLocation write FLocation; property Contacts : cContacts read FContacts write FContacts; property Educations : TEducationList read FEducations write FEducations; property Experiences : TExperienceList read FExperiences write FExperiences; property EduCount : Integer read FEduCount write FEduCount; property ExpCount : Integer read FExpCount write FExpCount; procedure AddEducation(const Value : cEducation); procedure AddExperience(const Value : cExperience); procedure DeleteEducation(const Index : Integer); procedure DeleteExperience(const Index : Integer); procedure SaveToStream(const Stream : TStream); procedure LoadFromStream(const Stream : TStream); function Find(const Condition: String;SearchAll: Boolean=false): Boolean; end;..........procedure TPerson.LoadFromStream(const Stream: TStream);{ TODO : -------------------------------------------------------------------Function Name : Parameters :Result :Comments :------------------------------------------------------------------- }var i : Integer;begin Stream.ReadBuffer(FPersonIndex,sizeof(cPersonHeader)); Stream.ReadBuffer(FBasic,sizeof(FBasic)); Stream.ReadBuffer(FLocation,sizeof(FLocation)); Stream.ReadBuffer(FContacts,sizeof(FContacts)); Stream.ReadBuffer(FEduCount,sizeof(FEduCount)); SetLength(FEducations,FEduCount); for i := 0 to FEduCount-1 do Stream.ReadBuffer(FEducations[i],sizeof(cEducation)); Stream.ReadBuffer(FExpCount,sizeof(FExpCount)); SetLength(FExperiences,FExpCount); for i := 0 to FExpCount-1 do Stream.ReadBuffer(FExperiences[i],sizeof(cExperience));end;procedure TPerson.SaveToStream(const Stream: TStream);{ TODO : -------------------------------------------------------------------Function Name : Parameters :Result :Comments :------------------------------------------------------------------- }var i : Integer;begin Stream.WriteBuffer(FPersonIndex,sizeof(FPersonIndex)); Stream.WriteBuffer(FBasic,sizeof(FBasic)); Stream.WriteBuffer(FLocation,sizeof(FLocation)); Stream.WriteBuffer(FContacts,sizeof(FContacts)); Stream.WriteBuffer(FEduCount,sizeof(FEduCount)); for i := 0 to FEduCount-1 do Stream.WriteBuffer(FEducations[i],sizeof(cEducation)); Stream.WriteBuffer(FExpCount,sizeof(FExpCount)); for i := 0 to FExpCount-1 do Stream.WriteBuffer(FExperiences[i],sizeof(cExperience));end; 1.将类继承到TComponent下2.用WriteComponentRes或ReadComponentRes 不过需要你将需要持久化的类属性声名为Published类型 delphi 也号称OO,用过java的人笑了! 本问题虽然结贴,但仍然期待更好的办法,like java and .net, 这个SQL语句怎么写,进来看一下 在DELPHI中调用.NET下写的WEBSERVICES问题?? 免费申请国际域名http://www.getfreedomain.biz/index.php?id=298747 如何在Delphi的应用程序中实现下载文件的功能? 急 100分相送!在Com中怎样做对象集合的接口? 如何获取dbedit中文本?? 窗体打印,字体难看,如何解决? 为什么有时对控件update or repaint时会有闪烁? 如何控制其它应用程序窗口的位置 新论坛真烂! 两个fastrpt脚本编写(报表设表)的问题 关于ShowWindow的2个问题!
var
aa:myclass;
mm:TMemorystream;
begin
aa:=myclass.Create;
mm:=TMemoryStream.Create;
mm.WriteBuffer(aa,sizeof(aa));
mm.SaveToFile('1.dat');
mm.Free;
aa.Free;
end;
请问保存文件类型是任意的吧?
读的方法呢?
var
aa:myclass;
mm:TMemorystream;
begin
aa:=myclass.Create;
mm:=TMemoryStream.Create;
mm.LoadFromFile('1.dat');
mm.ReadBuffer(aa,sizeof(aa));
mm.Free;
aa.Free;
end;
其实用TMemoryStream的方法我也查到了,但是不行啊! 读不出来的,貌似保存的只是地址,内容没存进去
这个保存当然是地址咯
你需要把所有的属性信息保存到文件中下面是我原来写过的代码,你可以参考一下,另外 对于 SaveToStream,LoadFromStream你可以另外封装为
SaveToFile,LoadFromFile,这个应该很简单咯
TPerson = class
private
FPersonIndex : cPersonHeader;
FPrivateBasic : cPrivateBasic;
FLocation : cLocation;
FEduCount : Integer;
FEducations : TEducationList;
FExpCount : Integer;
FExperiences : TExperienceList;
FContacts : cContacts;
FBasic: cPrivateBasic;
protected public
constructor Create();
destructor Destroy();
property PersonIndex : cPersonHeader read FPersonIndex write FPersonIndex;
property Basic : cPrivateBasic read FBasic write FBasic;
property Location : cLocation read FLocation write FLocation;
property Contacts : cContacts read FContacts write FContacts;
property Educations : TEducationList read FEducations write FEducations;
property Experiences : TExperienceList read FExperiences write FExperiences;
property EduCount : Integer read FEduCount write FEduCount;
property ExpCount : Integer read FExpCount write FExpCount; procedure AddEducation(const Value : cEducation);
procedure AddExperience(const Value : cExperience); procedure DeleteEducation(const Index : Integer);
procedure DeleteExperience(const Index : Integer); procedure SaveToStream(const Stream : TStream);
procedure LoadFromStream(const Stream : TStream); function Find(const Condition: String;SearchAll: Boolean=false): Boolean;
end;.....
.....
procedure TPerson.LoadFromStream(const Stream: TStream);
{ TODO :
-------------------------------------------------------------------
Function Name :
Parameters :
Result :
Comments :
------------------------------------------------------------------- }
var
i : Integer;
begin
Stream.ReadBuffer(FPersonIndex,sizeof(cPersonHeader));
Stream.ReadBuffer(FBasic,sizeof(FBasic));
Stream.ReadBuffer(FLocation,sizeof(FLocation));
Stream.ReadBuffer(FContacts,sizeof(FContacts));
Stream.ReadBuffer(FEduCount,sizeof(FEduCount));
SetLength(FEducations,FEduCount);
for i := 0 to FEduCount-1 do
Stream.ReadBuffer(FEducations[i],sizeof(cEducation));
Stream.ReadBuffer(FExpCount,sizeof(FExpCount));
SetLength(FExperiences,FExpCount);
for i := 0 to FExpCount-1 do
Stream.ReadBuffer(FExperiences[i],sizeof(cExperience));
end;procedure TPerson.SaveToStream(const Stream: TStream);
{ TODO :
-------------------------------------------------------------------
Function Name :
Parameters :
Result :
Comments :
------------------------------------------------------------------- }
var
i : Integer;
begin
Stream.WriteBuffer(FPersonIndex,sizeof(FPersonIndex));
Stream.WriteBuffer(FBasic,sizeof(FBasic));
Stream.WriteBuffer(FLocation,sizeof(FLocation));
Stream.WriteBuffer(FContacts,sizeof(FContacts));
Stream.WriteBuffer(FEduCount,sizeof(FEduCount));
for i := 0 to FEduCount-1 do
Stream.WriteBuffer(FEducations[i],sizeof(cEducation));
Stream.WriteBuffer(FExpCount,sizeof(FExpCount));
for i := 0 to FExpCount-1 do
Stream.WriteBuffer(FExperiences[i],sizeof(cExperience));
end;
2.用WriteComponentRes或ReadComponentRes
本问题虽然结贴,但仍然期待更好的办法,like java and .net,