Serialize-Deserialize

This commit is contained in:
Mikhalkovich Stanislav 2020-12-08 16:23:13 +03:00
parent 97e7af7925
commit 969b81f48a
4 changed files with 110 additions and 0 deletions

View file

@ -0,0 +1,19 @@
// Сериализация объектов
// Можно сериализовать только объекты, помеченные атрибутом [Serializable]
// Внешние Serialize, Deserialize позволяют сохранить в файле - восстановить
// один объект (один граф объектов с данным корнем)
type
[Serializable]
Node = auto class
x: integer;
next: Node;
end;
const fname = 'a.dat';
begin
var m := new Node(5,new Node(3,new Node(4,nil)));
Serialize(fname,m); // Сериализуем объект в файл
var m1 := Deserialize(fname) as Node; // Десериализуем из файла
Print(m1);
end.

View file

@ -0,0 +1,28 @@
// Сериализация объектов
// Можно сериализовать только объекты, помеченные атрибутом [Serializable]
// Внешние Serialize, Deserialize позволяют сохранить в файле - восстановить
// один объект (один граф объектов с данным корнем)
type
[Serializable]
My = auto class
x,y: integer;
end;
IntArray = array of integer;
const fname = 'a.dat';
begin
var f := CreateBinary(fname);
f.Serialize(new My(444,555));
f.Serialize(|1,2,3|);
f.Serialize(Lst(1..9));
f.Close;
f := OpenBinary(fname);
var m: My := f.Deserialize as My;
var a: array of integer := f.Deserialize as IntArray;
var l: List<integer> := f.Deserialize as List<integer>;
f.Close;
Print(m,a,l);
end.

View file

@ -0,0 +1,18 @@
// Сериализация объектов
// Можно сериализовать только объекты, помеченные атрибутом [Serializable]
// Внешние Serialize, Deserialize позволяют сохранить в файле - восстановить
// один объект (один граф объектов с данным корнем)
type
[Serializable]
My = auto class
x,y: integer;
end;
const fname = 'a.dat';
begin
var m := new My(2,3);
Serialize(fname,m); // Сериализуем объект в файл
var m1 := Deserialize(fname) as My; // Десериализуем из файла
Print(m1);
end.

View file

@ -253,6 +253,9 @@ type
/// Предоставляет методы для точного измерения затраченного времени
Stopwatch = System.Diagnostics.Stopwatch;
/// Указывает на возможность сериализации класса
Serializable = System.SerializableAttribute;
/// Представляет тип короткой строки фиксированной длины 255 символов
ShortString = string[255];
@ -586,6 +589,10 @@ type
function ReadReal: real;
/// Считывает строку из бестипового файла
function ReadString: string;
/// Сериализует объект в файл (объект должен иметь атрибут [Serializable])
procedure Serialize(obj: object);
/// Десериализует объект из файла
function Deserialize: object;
end;
type
@ -1183,6 +1190,12 @@ procedure Println(params args: array of object);
/// Выводит значения a,b,... в текстовый файл f, после каждого значения выводит пробел и переходит на новую строку
procedure Println(f: Text; params args: array of object);
/// Сериализует объект в файл (объект должен иметь атрибут [Serializable])
procedure Serialize(filename: string; obj: object);
/// Десериализует объект из файла
function Deserialize(filename: string): object;
// -----------------------------------------------------
//>> Общие подпрограммы для работы с файлами # Common subroutines for files
// -----------------------------------------------------
@ -2818,6 +2831,9 @@ function WINAPI_AllocConsole: longword; external 'kernel32.dll' name 'AllocConso
var
console_alloc: boolean := false;
type
BinaryFormatter = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter;
// -----------------------------------------------------
// Internal functions
@ -6677,6 +6693,18 @@ begin
Result := Self.br.ReadString;
end;
procedure BinaryFile.Serialize(obj: object);
begin
var formatter := new BinaryFormatter;
formatter.Serialize(fs,obj);
end;
function BinaryFile.Deserialize: object;
begin
var formatter := new BinaryFormatter;
Result := formatter.Deserialize(fs);
end;
// -----------------------------------------------------
// Eoln - Eof
// -----------------------------------------------------
@ -6997,6 +7025,23 @@ begin
Print(f, args);
Writeln(f);
end;
procedure Serialize(filename: string; obj: object);
begin
var fs := new System.IO.FileStream(filename,System.IO.FileMode.Create);
var formatter := new BinaryFormatter;
formatter.Serialize(fs,obj);
fs.Close;
end;
function Deserialize(filename: string): object;
begin
var fs := new System.IO.FileStream(filename,System.IO.FileMode.Open);
var formatter := new BinaryFormatter;
Result := formatter.Deserialize(fs);
fs.Close;
end;
// -----------------------------------------------------
// Text files
// -----------------------------------------------------