我最近从 D2010 迁移到 DXE2,并在 XE2 和 XE3(在我的朋友 XE3 中测试)中发现了一个与类内 TBytes 字段的 RTTI 生成相关的惊人错误(或功能?)。
我发现永远不会生成类中 TBytes 变量的 RTTI 信息。
以下代码在 D2010 中运行良好,但在 XE2/XE3 中显示消息“错误”
有没有人有任何线索?这将完全破坏我们所有的软件数据序列化实现
要测试代码,请将 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;
当检查 Field2 是 TBytes 时将显示错误消息,因为 FieldType 始终为 nil !!!
有人知道从 D2010 到 XE2 的 RTTI 发生了什么变化吗?可能是因为 TBytes 类型从 Byte 数组更改为泛型数组?