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


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

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

 


рис.6

 

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

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

Способ 1

 

 

рис.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();

}

}

 



Дата добавления: 2019-02-08; просмотров: 678;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.