我最近从D2010迁移到DXE2,并发现了一个严重的 bug (或者特性?) 在XE2和XE3(我朋友的XE3中测试)与类内TBytes字段的 RTTI 生成相关。
我发现类内 TBytes 变量的 RTTI 信息从未被生成。
以下代码在 D2010 中工作良好,但在 XE2/XE3 中显示 "Error" 消息。
有人有任何线索吗?这将完全破坏我们所有的软件数据序列化实现。
为测试该代码,请在 uses 声明中添加 Rtti 单元。
type
TMyClass = class
public
Field1: Integer;
Field2: TBytes;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
Data: TMyClass;
Rtti: TRttiContext;
RttiClassType: TRttiInstanceType;
begin
Data := TMyClass.Create;
try
// Get the context
Rtti := TRttiContext.Create;
try
// Get the type for the class
RttiClassType := TRttiInstanceType(Rtti.GetType(Data.ClassInfo));
// Check the fields
for i := 0 to High(RttiClassType.GetFields) do
begin
// Check the field type
if not Assigned(RttiClassType.GetFields[i].FieldType) then
ShowMessage('Error');
end;
finally
Rtti.Free;
end;
finally
Data.Free;
end;
end;
由于FieldType始终为空,所以在检查TBytes类型的Field2时会显示错误信息!!!
有人知道D2010到XE2中RTTI发生了什么变化吗?也许是因为TBytes类型从字节数组更改为通用数组了吗?