当前位置 : 主页 > 编程语言 > delphi >

如何在delphi中反序列化子属性?

来源:互联网 收集:自由互联 发布时间:2021-06-23
从两天前开始,我开始从头开始创建自己的简单类,来自TObject,没什么特别的.我还需要在文件中写入/读取它们,所以经过一些搜索,因为我还没有学会序列化的所有细节而没有完全得到它们
从两天前开始,我开始从头开始创建自己的简单类,来自TObject,没什么特别的.我还需要在文件中写入/读取它们,所以经过一些搜索,因为我还没有学会序列化的所有细节而没有完全得到它们,我从 here借用了序列化方法.它工作得很好因为我正在测试它.然后我添加了另一个类作为属性(这就是我所说的sup-property:类的属性,这是我班级的属性……这很混乱,需要一个合适的名称),遵循以下建议: this关于如何实际做到这一点的问题.现在写入文件似乎没有引起任何错误,然后再次我不确定子属性是否正确写入或者它只是垃圾.然而,阅读它确实会导致

Exception class EPropertyConvertError with message ‘Invalid property type: TSomething’

因为我刚学这个,所以我不确定是什么问题.我确实有一些猜测,其中一个是TSomething = Class可能必须拥有它自己的序列化方法?在那种情况下,这甚至会如何工作(因为即使我不相信这个假设)?另一个是我从delphi.about.com借来的代码无法处理这些类型的属性?如果是这样,我怎么能改进它?如果我的猜测都不正确,那么如何才能使这项工作成功呢? (我正在使用DelphiXE2.)

根据要求编码:

TSomething = Class
protected
  fNumber: integer;
  fLine: string;
public
  procedure Assign(Source: TObject);
published
  property Number: integer read fNumber write fNumber;
  property Line: string read fLine write fLine;
End;

TOther = Class
public
  procedure LoadFromStream(const Stream: TMemoryStream);
  procedure SaveToStream(const Stream: TMemoryStream);
  constructor Create; virtual;
  destructor Destroy; override;
protected
  fSomething: TSomething;
  procedure SetfSmth(AValue: TSomething);
published
  property Something: TSomething read fSomething write SetfSomething;
end;

这些方法的实现是从上面提供的两个链接中借用的,我认为没有必要重新输入,除非被要求.

要序列化TSomething,它必须是子组件.要做到这一点,你必须改变一件事:不要从TObject派生两个类,而是从TComponent派生.然后在你调用的TSomething构造函数中

Self.SetSubComponent(True);

最后,由于您的类是TComponent,您将不再需要从delphi.about中获取的东西,因为TComponent可以通过使用WriteComponent / ReadComponent在TStream中直接序列化

选择正确的后代时,你会发现这个过程比较简单.这里的选择是逻辑:如果你想序列化,那么使用TComponent.

网友评论