Сериализация динамических массивов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сериализация динамических массивов

Сообщение alexs » 29.03.2020 23:46:11

Кто либо занимался данной проблемой?
Хочется сделать малой кровью, только средствами RTTI - без написания своей обёртки.
Может кто подтолкнёт куда рыть?
Упёрся в момент - как зная не типизированный указатель на свойство объекта измениь размер динамического массива.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Сериализация динамических массивов

Сообщение runewalsh » 30.03.2020 00:45:50

DynArraySetLength делает буквально это, нет?
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Сериализация динамических массивов

Сообщение Cheb » 30.03.2020 10:54:07

Без грязных хаков не получается, т.к. соотв. структуры данных - не публичные.
Здесь 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.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru