gpt4 book ai didi

delphi - 变体记录的 Rtti

转载 作者:行者123 更新时间:2023-12-03 15:58:48 27 4
gpt4 key购买 nike

我尝试使用 Delphi 2010 编写一种对象/记录序列化程序,并想知道是否有一种方法可以检测记录是否是变体记录。例如。 Types.pas 中定义的 TRect 记录:

TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Longint);
1: (TopLeft, BottomRight: TPoint);
end;

由于我的序列化程序应该在我的数据结构上递归工作,因此它将下降到 TPoint 记录并在我的序列化文件中生成冗余信息。有没有办法通过获取记录的详细信息来避免这种情况?

最佳答案

一种解决方案可能如下:

procedure SerializeRecord (RttiRecord : TRttiRecord)

var
AField : TRttiField;
Offset : Integer;

begin
Offset := 0;
for AField in RttiRecord.Fields do
begin
if AField.Offset < Offset then Exit;
Offset := AField.Offset; //store last offset
SerializeField (AField);
end;
end;

但是这个解决方案并不是适合所有情况的正确解决方案。它仅适用于序列化,如果不同的变体包含相同的信息和相同的类型。如果您有类似以下内容(来自 wikipedia.org):

type   
TVarRec = packed record
case Byte of
0: (FByte: Byte;
FDouble: Double);
1: (FStr: ShortString);
end;

你会序列化吗

FByte=6
FDouble=1.81630607010916E-0310

或者序列化会更好

FStr=Hello!

是的,当然,这对于计算机来说也是一样的,但对于人类应该可读甚至可编辑的文件来说则不同。

所以我认为,解决问题的唯一方法是使用属性来定义应该使用哪个变体进行序列化。

关于delphi - 变体记录的 Rtti,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2757115/

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