网上资料好像比较少,查了下:一说利用TWriter配合TFileStream,不过这样的话,序列化函数还得自己写,如果字段比较多,就麻烦了,又没有类似WriteObject的方法,只有WriteComponent,假如我不是从TComponent继承下来的话,就用不了了.一说是用WriteResourceResFile,问题同上,也是局限于Component.有没有类似C#中已经封装好了的Formatter,或者第三方代码可以实现对象的直接序列/反序列化呢?
解决方案 »
- 提个做动态报表的问题,请教各位
- 用TSocketConnection如何进行文件传输?
- 出了奇怪的事了,不知道是什么原因,请高手相助,谢谢
- SQL语句
- 跨网段使用sqlserver,支持事务处理的COM+报“新事务不能登记到指定的事务处理器中”?
- 这个sql比较难,请大哥不要退缩。进来看看。
- 主从表的DBGrid
- 怎么生成只有数字和字母组成的注册码,并且可逆
- 如何实现这种功能!!!!???
- 我用Tclientsocket实现了文件的发送,本来可以找mm聊天去了,后来发现。。。
- 哪位同学有计算机杂志或者报纸的编辑的msn或者qq号码?能告诉俺吗?俺写了个文章想投, 谢谢.
- 请问主键重复问题如何处理,在线等,TKS!
不过可以自己写,任何声明为{M+}的对象都支持RTTI,可以列举对象的Properties并且Read/Write。
想序列化TObject,是不可能的,你以为是Java啊.
oh, 我忽略这点了. 那用什么来序列化TPersistent继承下来的类呢? 我找到的方法都是针对TComponent的 -_-
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;
这就是对TObject有效的序列化.以前我很多代码都这样写的,很简单的.