网上资料好像比较少,查了下:一说利用TWriter配合TFileStream,不过这样的话,序列化函数还得自己写,如果字段比较多,就麻烦了,又没有类似WriteObject的方法,只有WriteComponent,假如我不是从TComponent继承下来的话,就用不了了.一说是用WriteResourceResFile,问题同上,也是局限于Component.有没有类似C#中已经封装好了的Formatter,或者第三方代码可以实现对象的直接序列/反序列化呢?

解决方案 »

  1.   

    Delphi VCL中没有你想要的功能。
    不过可以自己写,任何声明为{M+}的对象都支持RTTI,可以列举对象的Properties并且Read/Write。
      

  2.   

    Delphi For Win32 不能实现你想要的那种功能.
      

  3.   

    只能序列化从TPersitent继承下来的对象
    想序列化TObject,是不可能的,你以为是Java啊.
      

  4.   

    to superyys:
    oh, 我忽略这点了. 那用什么来序列化TPersistent继承下来的类呢? 我找到的方法都是针对TComponent的 -_-
      

  5.   

    to 楼上:事实上一般的代码都是针对TComponent,因为delphi的序列化主要是针对组件序列化,而不是普通对象.Tpersisten只是提供了最基本的流化能力,应该是RTTI的支持,以下是delphi的帮助文档写的
    TPersistent is the ancestor for all objects that have assignment and streaming capabilities.
    实际应用时还是应该用TComponent,因为TReader和TWriter都只支持Tcomponent流化,除非你自己写个TReader和TWriter,就有可能支持TPersiten的流化.在实际编程中,你可以把你的对象直接从TComponent继承,用以下两个函数即可
    function ComponentToString(Component: TComponent): string;var
      BinStream:TMemoryStream;
      StrStream: TStringStream;
      s: string;
    begin
      BinStream := TMemoryStream.Create;
      try
        StrStream := TStringStream.Create(s);
        try
          BinStream.WriteComponent(Component);
          BinStream.Seek(0, soFromBeginning);
          ObjectBinaryToText(BinStream, StrStream);
          StrStream.Seek(0, soFromBeginning);
          Result:= StrStream.DataString;
        finally
          StrStream.Free;    end;
      finally
        BinStream.Free
      end;
    end;function StringToComponent(Value: string): TComponent;
    var
      StrStream:TStringStream;
      BinStream: TMemoryStream;
    begin
      StrStream := TStringStream.Create(Value);
      try
        BinStream := TMemoryStream.Create;
        try
          ObjectTextToBinary(StrStream, BinStream);
          BinStream.Seek(0, soFromBeginning);
          Result := BinStream.ReadComponent(nil);    finally
          BinStream.Free;
        end;
      finally
        StrStream.Free;
      end;
    end;
      

  6.   

    其实还有变通的功能,不一定要流化,都可以保存到磁盘/从磁盘恢复 TObject的数据方法很简单,就是sizeof(TMyObject)的大小,定义一个buffer指向对象,直接把那一块内存写入文件,反序列化时从文件读取就可以了,
    这就是对TObject有效的序列化.以前我很多代码都这样写的,很简单的.