Delphi XE2 RTTI сломан?

Я недавно мигрировал из D2010 в DXE2 и обнаружил ошибку showtopper (или функцию?) в XE2 и XE3 (проверено в моем друге XE3), связанную с генерацией RTTI для полей TBytes внутри классов.

Я обнаружил, что информация RTTI для переменной TBytes внутри класса никогда не генерируется.

Следующий код хорошо работает в 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 всегда равен нулю !!!

Кто-нибудь знает, что изменилось в RTTI от D2010 до XE2? Может быть, потому что тип TBytes был изменен с массива байтов на общий массив?

12 голосов | спросил Eric 1 +04002012-10-01T22:54:02+04:00312012bEurope/MoscowMon, 01 Oct 2012 22:54:02 +0400 2012, 22:54:02

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132