Без грязных хаков не получается, т.к. соотв. структуры данных - не публичные.
Здесь 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.