Без грязных хаков не получается, т.к. соотв. структуры данных - не публичные.
Здесь parray - указатель именно на поле.
- Код: Выделить всё
procedure NewDynArray(parray: pointer; Len: integer; pi: PTypeInfo);
var
L: SizeInt;
begin
pointer(parray^):= nil;
L:= Len;
System.DynArraySetLength(pointer(parray^), pi, 1, @L);
end;
type
pdynarray = ^tdynarray;
tdynarray = packed record
refcount : ptrint;
high : tdynarrayindex;
end;
function GetDynArrayLength(parray: pointer): integer;
begin
Result:= pdynarray(ptruint(ptruint(parray^)
- ptruint(sizeof(tdynarray))))^.high + 1;
end;
procedure IncDynArrayRefCount(parray: pointer);
begin
if Assigned(parray) and Assigned (pointer(parray^)) then
Inc(pdynarray(ptruint(ptruint(parray^)
- ptruint(sizeof(tdynarray))))^.refcount);
end;
P.S. Могу быть неправ, но чистой RTTI без своего велосипеда регистрации классов я бы сериализации добиться не смог, поскольку RTTI содержит данные только по published полям. По крайней мере, в фпц 1.9.2 так было.
P.P.S. В фпц 3.2 изменился формат RTTI: мой движок крашится при попытке ея использовать, если собирать транком 3.3.1.