|
Программирование >> Обработка исключительных ситуаций
foreachC Filelnfo f in files ) f.CopyToC dest + f.Name ); копирование файлов Console.WriteLineC Скопировано + files.Length + jpg-файлов ); catch ( Exception e ) Console.WriteLineC Error: + e.Message ); Использование классов Fi l e и Di rectory аналогично, за исключением того, что их методы являются статическими и, следовательно, не требуют создания объектов. Сохранение объектов (сериализация) В С# есть возможность сохранять на внешних носителях не только данные примитивных типов, но и объекты. Сохранение объектов называется сериализацией, а восстановление сохраненных объектов - десериализацией. При сериализации объект преобразуется в линейную последовательность байтов. Это сложный процесс, поскольку объект может включать множество унаследованных полей и ссылки на вложенные объекты, которые, в свою очередь, тоже могут состоять из объектов сложной структуры. К счастью, сериализация выполняется автоматически, достаточно просто пометить класс как сериализуемый с помощью атрибута [Serial izable] . Атрибуты рассматриваются в главе 12, пока же достаточно знать, что атрибуты - это дополнительные сведения о классе, которые сохраняются в его метаданнгх. Те поля, которые сохранять не требуется, помечаются атрибутом [NonSerialized] , например: [Serializable] class Demo public int a = l: [NonSerialized] public double y: public Monster X. Y; Объекты можно сохранять в одном из двух форматов: двоичном или SOAP (в виде XML-файла). В первом случае следует подключить к программе пространство имен System.Runtime.Serialization.Formatters.Binary, во втором - пространство System.Runtime.Seri alizati on.Formatters.Soap. Рассмотрим сохранение объектов в двоичном формате. Для этого используется класс BinaryFormatter, в котором определены два метода: Serialize( поток, объект ); DeserializeC поток ): Метод Serialize сохраняет заданный объект в заданном потоке, метод Deserialize восстанавливает объект из заданного потока. В листинге 11.11 объект приведенного ранее класса Demo сохраняется в файле на диске с именем Demo.bin. Этот файл можно просмотреть, открыв его, к примеру, в Visual Studic.NET. Листинг 11.11. Сериализация объекта using System: using System.10; us i ng System.Runti me.Seri a 1 i zat i on.Formatters.Bi na ry; namespace ConsoleApplicationi [Serializable] abstract class Spirit { public abstract void PassportO; [Serializable] class Monster : Spirit public Monster( int health, int ammo, string name ) this.health = health; this.ammo - ammo; this.name = name: override public void PassportO Console.WriteLineC Monster {0} \t health = {1} anmio = {2} , name, health, ammo ); string name; int health, ammo; [Serial izable] class Demo public int a = 1; Сохранение объектов (сериализация) [NonSerialized] public double b; public Monster X, Y; class Classl { static void MainO d = DemoO; d.X = new Monster( 100. 80. Вася ); d.Y = new MonsterC 120, 50, Петя ); d.a - 2; d.b = 2; d.X. PassportO; d. Y. PassportO; Console.WriteLineC d.a ); Console.WriteLineC d.b ); FileStream f = new FileStreamC Demo.bin , FileMode.Create ); BinaryFormatter bf = new BinaryFormatterO; bf.Serialize( f, d ); сохранение объекта d в потоке f f.CloseO: В программе не приведены неиспользуемые методы и свойства классов. Обратите внимание на то, что базовые классы сохраняемых объектов также должны быть помечены как сохраняемые. Результат работы программы: Monster Вася Monster Петя 2 2 health = 100 amu = 80 health = 120 aimo = 50 Итак, для сохранения объекта в двоичном формате необходимо: 1. Подключить к программе пространство имен System.Runtime.Serialization. Formatters.Binary. 2. Пометить сохраняемый класс и связанные с ним классы атрибутом [Serializable]. 3. Создать поток и связать его с файлом на диске или с областью оперативной памяти. 4 . Создать объект класса BinaryFormatter. 5. Сохранить объекты в потоке. 6. Закрыть файл. В листинге 11.12 сохраненный объект считывается из файла.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |