gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:29:24 25 4
gpt4 key购买 nike

从两天前开始,我开始从头开始制作自己的简单类,继承自 TObject,没什么花哨的。我还需要将它们写入文件/从文件中读取它们,所以经过一番搜索,因为我还没有学习序列化的所有来龙去脉,也没有完全理解它们,所以我借用了here的序列化方法。 。当我测试它时它工作得很好。然后我添加了另一个类作为属性(这就是我说的 super 属性时所指的:类的属性是我的类中的属性......这很令人困惑,它需要一个正确的名称),遵循中的建议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 获取的内容,因为可以使用 WriteComponent 在 TStream 中直接序列化 TComponent >/读取组件

您会发现选择正确的后代时过程会更容易。这里的选择是逻辑:如果你想序列化,那么使用 TComponent。

关于delphi - delphi中如何反序列化子属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11274192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com