变体记录的RTTI

3

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

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

由于我的序列化程序需要对数据结构进行递归处理,它会对TPoint记录进行下降并在我的序列化文件中生成冗余信息。有没有办法通过获取记录的详细信息来避免这种情况呢?


你到目前为止尝试了什么? - Jeroen Wiert Pluimers
1个回答

1
一个解决方案可能如下所示:
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!

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

因此,我认为解决问题的唯一方法是使用属性来定义应该用于序列化的变量。


顺便提一下:记录中各个变量部分的大小可能不同!使用当前的解决方案可能会丢失信息。因此,应该检查累积字段大小是否与记录大小匹配。 - Christian Metzler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接