Динамический массив в файл и обратно

И медленнее :slight_smile:

##
var a: array of array of array of integer 
    := |||1,2,3|,|4,5,6||,||7,8,9|,|10,11,12|||;
Serialize('a.dat',a);
var obj := Deserialize('a.dat');
Print(obj);

2 лайка

Это красиво, но в 10 раз медленнее, потому что рефлексия…

2 лайка

Зато сохраняет все типы. Были бы ссылки - и их бы сохранила

Но я не получаю данные в переменную типа array of array of array of integer . Они читаются в object.

Разумеется, тип переменной должен быть известен при компиляции, но содержимое файла достаётся при выполнении - там может оказаться любой объект.

Надо показать компилятору что вы понимаете что делаете. К примеру оператором as.

1 лайк

А вообще, @Admin, туда бы сразу такую перегрузку:

function DeserializeAs<T>(fname: string) := T(Deserialize(fname));

as в этом случае вернёт nil, если в файле не тот тип данных. А явное преобразование T() даст хорошо описанное исключение, что к чему не получилось преобразовать.

В случае массивов как раз as работает, а явное преобразование нельзя так описать - синтаксис не примет. Поэтому лучше иметь перегрузку заранее.

1 лайк

Спасибо. Ваши ответы очень помогли. Переменная сохраняется и читается.

type T1 = array of array [,] of byte;
var obj := Deserialize('ArrOfPairs.dat');
ArrOfPairs := T1(obj);

array of array of array of T и array of array [,] of T это не одно и то же

1 лайк

Разные типы переменных сохраняю. Тема немного изменилась)