und beim 4. Feld knallt es dann, weil das byte-array nicht konvertiert werden kann.
Das kann nicht konvertiert werden da es keine Typ-Informationen hat. Grade im jahrzehntealten
RTL-Code ging den Borland-Leuten anscheinend einer ab, alles mögliche inline zu deklarieren:
Delphi-Quellcode:
TGUID = packed record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
class operator Equal(const Left, Right: TGUID): Boolean;
class operator NotEqual(const Left, Right: TGUID): Boolean;
class function Empty: TGUID; static;
end;
Hätte man statt
D4: array[0..7] of Byte;
gesagt
D4: TMyArray
wäre alles glatt gelaufen.
Hier ein ganz kurzer Test, ganz ohne TGUID:
Delphi-Quellcode:
unit Unit16;
//{$DEFINE DOFAIL}
interface
type
{$IFDEF DOFAIL}
TSomeRecord =
record
myStaticArray:
array[0..1]
of Byte;
end;
{$ELSE}
TSomeRecord =
record
public type
TMyByteArray =
array[0..1]
of Byte;
public var
myStaticArray: TMyByteArray;
end;
{$ENDIF}
TMyClass =
class(TObject)
public var
myRecord: TSomeRecord;
end;
procedure testMarshalling();
implementation uses REST.Json;
procedure testMarshalling();
var
instance: TMyClass;
asJson:
String;
begin
instance := TMyClass.Create();
try
asJson := TJson.ObjectToJsonString(instance);
finally
instance.Destroy();
end;
instance := TJson.JsonToObject<TMyClass>(asJson);
end;
end.
Wie man das im Fall von
System.TGUID
umschiffen kann? Ich habe ehrlich gesagt auch keine Ahnung. Die Serialisierung von Records läuft eh komisch ab, das siehst du ja auch daran dass er sie einfach als Json-Array serialisiert. Ich glaube die
RTTI weiß zur Laufzeit auch gar nicht mehr, wie die Record-Felder hießen.