diff --git a/InstallerSamples/StandardUnits/PABCSystem/SerializationGraph.pas b/InstallerSamples/StandardUnits/PABCSystem/SerializationGraph.pas new file mode 100644 index 000000000..8ac010c36 --- /dev/null +++ b/InstallerSamples/StandardUnits/PABCSystem/SerializationGraph.pas @@ -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. \ No newline at end of file diff --git a/InstallerSamples/StandardUnits/PABCSystem/SerializationMany.pas b/InstallerSamples/StandardUnits/PABCSystem/SerializationMany.pas new file mode 100644 index 000000000..c5a2671b0 --- /dev/null +++ b/InstallerSamples/StandardUnits/PABCSystem/SerializationMany.pas @@ -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 := f.Deserialize as List; + f.Close; + + Print(m,a,l); +end. \ No newline at end of file diff --git a/InstallerSamples/StandardUnits/PABCSystem/SerializationOne.pas b/InstallerSamples/StandardUnits/PABCSystem/SerializationOne.pas new file mode 100644 index 000000000..9b395972c --- /dev/null +++ b/InstallerSamples/StandardUnits/PABCSystem/SerializationOne.pas @@ -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. \ No newline at end of file diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index ec6b68545..bc2865507 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -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 // -----------------------------------------------------