一种解决方案可能如下:
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!
是的,当然,这对于计算机也是一样的,但对于人类应该可读甚至可编辑的文件则不然。
所以我认为,解决问题的唯一方法是使用属性来定义应该使用哪个变体进行序列化。