1.组件对象的序列化
从TCOMPONENT继承下来的组件对象序列化都简单,因为它本身支持流化,通过流化也就达到了序列化组件对象的目的。
TReader和TWriter都只支持Tcomponent流化,除非你自己写个TReader和TWriter,就有可能支持TPersiten的流化. 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;
2.非组件对象的序列化
非组件对象,也就是从TObject或者从Tpersisten继承下来的对象的序列化却要变通一下。
方法很简单,就是sizeof(TMyObject)的大小,定义一个buffer指向对象,直接把那一块内存写入文件,反序列化时从文件读取就可以了, 这就是对非组件对象有效的序列化.
服务端序列化对象发送流程:
第一步:
var
buffer: array[0..1023] of char;//定义一个缓冲区
第二步:
Move(myobj, Buffer, Sizeof(count));//将对象的内存搬移到缓冲区
第三步:
WriteFileFromBuffer();//将缓冲区写入文件
第四步:
发送这个文件给客户端
客户端反序列化还原对象流程:
第一步:
接收這個文件
第二步:
ReadFileToBuffer()
第三步:
move(buffer,myobj,sizeof(count)) //还原对象