Сериализация/десериализация графа объектов
Если сериализуемый объект содержит ссылки на другие сериализуемые объекты, которые в свою очередь так же содержат ссылки на сериализуемые объекты, то такая структура образует граф объектов.
При сериализации объекта, находящегося в вершине графа, будет сериализован весь граф.
рис.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; просмотров: 684;