我最近从D2010迁移到DXE2,并且在XE2和XE3(在我的 friend XE3中测试过)中发现了与类内部TBytes字段的RTTI生成相关的showstopper bug(或功能?)。

我发现,永远不会生成类内部的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;

由于FieldType始终为nil,当检查Field2的长度为TBytes时,将显示错误消息!

有没有人知道XE2和D2010的RTTI发生了什么变化?也许是因为TBytes类型从Byte数组更改为泛型数组?

最佳答案

这是a known issue that was fixed in XE3.。不幸的是,升级是解决此问题的唯一方法。错误修复通常不会移植回。

编辑:是否。显然,这实际上并没有解决,因为它仍在XE3中发生。将其报告为新案件并提及103729可能是最好的做法。

10-07 19:21