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