//序列化到磁盘文件
procedure TTchildA.Button1Click(Sender: TObject);
var
  frm: myclass;
  fs: Tfilestream;
begin
  frm := myclass.Create(self);
  frm.sx := 'aaaaaaaaaa';
  fs := Tfilestream.Create('c:\xy.txt', fmcreate);
  fs.WriteComponent(frm);
  fs.Free;end;//反序列化回来使用,那里错了呢??
procedure TTchildA.Button2Click(Sender: TObject);
var
  fs: Tfilestream;
  my1, my2: myclass;
begin
  fs := Tfilestream.Create('c:\xy.txt', fmOpenRead);
  my2 := fs.ReadComponent(my2);    //这句不对呢??
  my2 := myclass(my1);
  ShowMessage(my2.sx);
end;

解决方案 »

  1.   

    procedure TCHILDA.btn2Click(Sender: TObject);
    var
      fs: Tfilestream;
      my1,my2: myclass;
    begin
      my1 := myclass.Create(self);
      fs := Tfilestream.Create('c:\xy.txt', fmOpenRead);
      my1 := myclass(fs.ReadComponent(my1));
      fs.Free;
      ShowMessage(my2.sx);//是空的,我赋了值的呀??  frm.sx := 'aaaaaaaaaaaaaaaaaaaa';
    end;
      

  2.   

    //反序列化回来使用,那里错了呢??
    procedure TForm1.Button2Click(Sender: TObject);
    var
      fs: Tfilestream;
      my2: myclass;
    begin
      fs := Tfilestream.Create('d:\xy.txt', fmOpenRead);
      my2 := myclass.create(self);  //增加这一句
      fs.ReadComponent(my2);    
      ShowMessage(my2.sx);end;其中 myclass 的SX 必须是published我是这个定义的
      type myclass = class(TComponent)
         public
           Fsx : string;
         published
            property sx:string read Fsx write Fsx;
      end;
      

  3.   

    Delphi中的序列化和反序列化,和C#,java等不太一样,因为Delphi设计之初支持序列化/反序列化,只是为了IDE考虑,并没有设计成通用的,所以,要想使自定义类有序列化/反序列化的能力,自定义类型貌似必须继承TComponent。我记得好像是这样的,还有待高人确认,给出正确答案。
      

  4.   


    对,必须继承TComponent,按我上面写的,已经可以正确运行。
      

  5.   

    我测试了一下,是可以的。如下代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TMyClass = class(TComponent)
        constructor Create(AOwner:TComponent);override;
      private
        fsx : string;
      published
        property PFsx: string read fsx write fsx;
      end ;var
      Form1: TForm1;implementation{$R *.dfm}{ MyClass }constructor TMyClass.Create(AOwner: TComponent);
    begin
      inherited;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      fs: TFileStream;
      MyClass: TMyClass;
    begin
      //
      MyClass := TMyClass.Create(Self);
      MyClass.PFsx := 'abcd';
      fs := TfileStream.Create('E:\data.dat',fmOpenWrite or fmCreate);
      try
        fs.WriteComponent(MyClass);
      finally
        fs.Free();
      end;end;procedure TForm1.btn2Click(Sender: TObject);
    var
      fs: TFileStream;
      myclass: TComponent;
    begin
      //
      fs := TfileStream.Create('E:\data.dat',fmOpenread);
      try
        myclass := fs.ReadComponent(nil);
        ShowMessage('Result:');
        ShowMessage(TMyClass(myclass).PFsx);
      finally
        fs.Free();
      end;
    end;initialization
      RegisterClasses([TMyClass]);end.