Сериализация/десериализация графа объектов

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002153.docx

Сериализация/десериализация графа объектов

Если сериализуемый объект содержит ссылки на другие сериализуе- мые объекты, которые в свою очередь так же содержат ссылки на сериа- лизуемые объекты, то такая структура образует граф объектов.


При сериализации объекта, находящегося в вершине графа, будет сериализован весь граф.

 

Произвольный доступ к сериализованным объектам.

Осуществляется так же, как и в случае хранения двоичных данных в файле.

рис.7

Length(Объект) = const

 

Способ 2

Использование файла указателей (см. лекцию 3).

 

Пример произвольного доступа к объектам

/*    У заданных студентов из файла С:\Temp\GroupSerial.bin заменить средние баллы. Фамилии студентов и их новые средние баллы ввести с клавиатуры.

Признаком конца списка является ввод Enter в качестве фамилии студента. Вывести файл на экран

*/

 

using System; using System.IO;

using System.Collections;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;


[Serializable] class Student

{

public string fio; public uint                    yar; public float  ball;

 

public Student(string f, uint y, float b)

{

fio = f; yar = y; ball = b;

}

public void Show()

{

Console.WriteLine("Студент {0}, год рождения {1}, ср.балл = {2}", fio,                  yar,          ball);

}

}

 

class Example1

{

public static void Main()

{

string            fio = " ";

Student        std; float newBall = 0; uint k;

long pos;

 

 

string path = @"c:\Temp\GroupSerial.bin"; FileStream fs;

BinaryFormatter frm;

 

ArrayList tableStd = new ArrayList(); frm = new BinaryFormatter();

// Выборочная модификация объектов

fs = new FileStream(path, FileMode.Open);

 

while (true)

{

Console.WriteLine("                                                         " + "                                                              ");

Console.Write(

"Введите фамилию (пробел - конец поиска): "); fio = Console.ReadLine();

 

if (fio == " " || fio.Length == 0) break;


try

{

Console.Write("Введите новый средний балл : "); newBall = float.Parse(Console.ReadLine());

}

catch

{

Console.WriteLine("ОШИБКА. Повторите ввод сначала"); continue;

}

 

try

{

k = 0;

while (fs.Position < fs.Length)

{

// Запомнить позицию читаемой записи

pos = fs.Seek(0, SeekOrigin.Current); std = (Student)frm.Deserialize(fs);

if (std.fio == fio)

{

Console.WriteLine("---Найден---"); std.ball = newBall;

fs.Seek(pos, SeekOrigin.Begin); frm.Serialize(fs, std);

k = 1;

}

}

if (k == 0)

Console.WriteLine("Студент не найден"); fs.Seek(0, SeekOrigin.Begin);

}

 

catch (Exception e)

{

Console.WriteLine("Error: " + e.Message); return;

}

}

fs.Close();

}

}