И медленнее
##
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);
Это красиво, но в 10 раз медленнее, потому что рефлексия…
Зато сохраняет все типы. Были бы ссылки - и их бы сохранила
Но я не получаю данные в переменную типа array of array of array of integer . Они читаются в object.
Разумеется, тип переменной должен быть известен при компиляции, но содержимое файла достаётся при выполнении - там может оказаться любой объект.
Надо показать компилятору что вы понимаете что делаете. К примеру оператором as
.
А вообще, @Admin, туда бы сразу такую перегрузку:
function DeserializeAs<T>(fname: string) := T(Deserialize(fname));
as
в этом случае вернёт nil
, если в файле не тот тип данных. А явное преобразование T()
даст хорошо описанное исключение, что к чему не получилось преобразовать.
В случае массивов как раз as
работает, а явное преобразование нельзя так описать - синтаксис не примет. Поэтому лучше иметь перегрузку заранее.
Спасибо. Ваши ответы очень помогли. Переменная сохраняется и читается.
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
это не одно и то же
Разные типы переменных сохраняю. Тема немного изменилась)