delphi – 我可以创建一个反序列化我的对象的字符串版本的构造函
发布时间:2020-12-15 04:13:58 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi帮助文件中的ComponentToString部分中的示例对对象(TComponent后代)进行序列化和反序列化.这样我就可以将对象存储在数据库的VARCHAR字段中. 当我需要从存储在数据库中的字符串实例化我的类的新实例时,我可以使用形式为CreateFromString(AOwn
我正在使用Delphi帮助文件中的ComponentToString部分中的示例对对象(TComponent后代)进行序列化和反序列化.这样我就可以将对象存储在数据库的VARCHAR字段中.
当我需要从存储在数据库中的字符串实例化我的类的新实例时,我可以使用形式为CreateFromString(AOwner:TComponent; AData:String)的构造函数来实现吗?或者我是否必须使用返回组件类实例的非类方法? 如果我可以使用构造函数版本,如何将ReadComponent的返回值“映射”到构造函数创建的“self”? 这是帮助文件中的反序列化示例: function StringToComponentProc(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; 解决方法
通常,是的,您可以使构造函数反序列化字符串并使用该信息初始化新实例.一个简单的例子就是具有单个Integer字段的类.将字符串传递给构造函数并让构造函数调用StrToInt并使用结果初始化该字段.
但是如果反序列化的唯一函数是也创建实例的函数,那么你就不能在构造函数中使用它,因为当你只需要一个实例时,你最终会得到两个实例.构造函数没有办法说,“没关系;毕竟不要构造一个实例.我已经在其他地方找到了一个.” 但是,这不是您所处的情况.正如您所知, constructor TLarryComponent.CreateFromString(const AData: string); var StrStream,BinStream: TStream; begin Create(nil); StrStream := TStringStream.Create(AData); try BinStream := TMemoryStream.Create; try ObjectTextToBinary(StrStream,BinStream); BinStream.Position := 0; BinStream.ReadComponent(Self); finally BinStream.Free; end; finally StrStream.Free; end; end; 在那里,我们将Self指定的当前对象传递给ReadComponent.流将忽略存储在流中的类名,并假设当前对象具有正确的类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |