我尝试用Delphi 2010编写一种对象/记录序列化程序,并想知道是否有一种方法可以检测,如果记录是变体记录。例如。 Types.pas中定义的TRect记录:
TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Longint);
1: (TopLeft, BottomRight: TPoint);
end;
由于我的序列化程序应该在我的数据结构上递归工作,它将在TPoint记录上下降并在我的序列化文件中生成冗余信息。有没有办法通过获取记录的详细信息来避免这种情况?
答案 0 :(得分: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!
是的,当然,对于计算机而言,这也是相同的,但对于人类可读或甚至可编辑的文件而言也是如此。
所以我认为,解决问题的唯一方法是使用Attribute来定义哪个变量应该用于序列化。