最近、D2010からDXE2に移行し、クラス内のTBytesフィールドのRTTI生成に関連するXE2およびXE3(友人のXE3でテスト済み)にショートッパーのバグ(または機能?)を見つけました。
クラス内のTBytes変数のRTTI情報が生成されないことがわかりました。
次のコードはD2010で正常に機能しますが、XE2/XE3で「エラー」というメッセージが表示されます。
誰か手がかりはありますか?これにより、すべてのソフトウェアデータシリアル化の実装が完全に破壊されます
コードをテストするには、Rttiユニットをuses宣言に追加してください
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であるため、TBytesであるField2をチェックすると、エラーメッセージが表示されます。
D2010からRTTIで何が変更されたのかXE2の手がかりを持っている人はいますか?おそらく、TBytesタイプがByteの配列から汎用配列に変更されたためですか?