Без грязных хаков не получается, т.к. соотв. структуры данных - не публичные.
Здесь 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);
// http://freepascal.ru/forum/viewtopic.php?f=1&t=9877
end;
{ copy-pasted from the FPC RTL (unit system) because not public }
type
pdynarray = ^tdynarray;
tdynarray = packed record
refcount : ptrint;
high : tdynarrayindex;
end;
// эта НЕ проверяет на NIL - я её вызываю для массивов, которые гарантированно Assigned
function GetDynArrayLength(parray: pointer): integer;
begin
Result:= pdynarray(ptruint(ptruint(parray^)
- ptruint(sizeof(tdynarray))))^.high + 1;
end;
//Chepersy is NOT thread-safe. Designed for a single-threaded architecture
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.