Атрибуты Работа с файлами Сериализация Лекция 9
Атрибуты Работа с файлами Сериализация
Атрибуты Работа с файлами Сериализация
Метаданные : Стандартные Расширенные ( атрибуты ) Атрибуты : Дополнительная информация о классе, методе и т. д. Использование Может учитываться во время компиляции Может учитываться во время исполнения
В квадратных скобках перед целевым объектом : [Serializable] [Obsolete] [DefaultMember(rre)] [MyAttrib(im, myval = 12345)] public struct Complex { double re, im; } [XmlIgnore] public double Re { get; set; }
Через информацию о члене : bool MemberInfo.IsDefined(Type attrType, bool inherit) – нет доступа к атрибутному объекту Только проверка о существовании атрибута Через атрибут : Attribute Attribute.GetCustomAttribute(MemberInfo mi, Type attrType) Attribute[] GetCustomAttributes(MemberInfo mi)
Сериализация – что и как сериализовать Работа с БД Автоматическое чтение / запись объектов в БД Автогенерация таблиц по атрибутам WCF, веб - сервисы Пометить метод как доступный удаленно Аспектно - ориентированное программирование
Attribute Класс, должен быть унаследован от класса Attribute public class ColumnAttribute : Attribute {…} AttributeUsage Можно задавать область применимости атрибута с помощью атрибута AttributeUsage [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class ColumnAttribute : Attribute {…}
Работа с атрибутами
Атрибуты Работа с файлами Работа с файловой системой Операции с потоками Сериализация
Пространство имен System.IO Работа с файловой системой DriveInfo Диски : DriveInfo DirectoryInfoDirectoryFileSystemInfo Папки : DirectoryInfo, Directory, FileSystemInfo FileFileInfoFileSystemInfo Файлы : File, FileInfo, FileSystemInfo Работа с путями Path Path Наблюдение за изменениями в файловой системе FileSystemWatcher FileSystemWatcher Работа с потоками ( чтение / запись файла ) Stream Stream, производные от него и классы обертки
Два способа работы : File, Directory – статические классы FileInfo, DirectoryInfo Многие методы похожие FileSystemInfo Базовый для FileInfo и DirectoryInfo DriveInfo Информация о диске Не связан с FileSystemInfo
Экземпляр представляет один диск DriveInfo drive = new DriveInfo("c"); DriveInfo drive = new Информация о диске системы Name Name – имя диска DriveType DriveType – тип диска. Например : Fixed, CDRom IsReady IsReady – готов ли к использованию ( например для CD Rom) VolumeLabel VolumeLabel – метка тома DriveFormat DriveFormat – тип файловой системы TotalSize TotalSize – размер диска AvailableFreeSpace AvailableFreeSpace – размер свободного места … Получение всех дисков GetDrives() Статически метод GetDrives() DriveInfo[] drives = DriveInfo.GetDrives();
Абстрактный класс Базовый класс для DirectoryInfo и FileInfo Свойства файла / папки Name Name – название файла, папки FullName FullName – полное имя, т. е. с полным путем Extension Extension - расширение Exists Exists – существует ли такой файл / папка CreationTimeLastAccessTime CreationTime, LastAccessTime – время создания / последнего доступа ( изменения ) Attributes Attributes - атрибуты ( только на чтение ) …
DirectoryInfo Экземпляр DirectoryInfo представляет одну папку файловой системы Наследник от FileSystemInfo Создание объекта ( но не физической папки на диске ) DirectoryInfo windowsFolder = new Получение информации о файлах и папках GetDirectories() GetDirectories() – получение подпапок. Возможен поиск по шаблону и поиск во всех дочерних папках DirectoryInfo[] folders = GetDirectories(); DirectoryInfo[] folders = di.GetDirectories(my*); DirectoryInfo[] folders = di.GetDirectories(my*, SearchOption.AllDirectories); GetFiles() GetFiles() – получение файлов FileInfo[] files = folder.GetFiles(); FileInfo[] files = folder.GetFiles("*.txt, SearchOption.TopDirectoryOnly); GetFileSystemInfos() GetFileSystemInfos() – получение всех файлов / папок FileSystemInfo[] fsi = folder.GetFileSystemInfos(); Операции с папками Create() Create() – создание папки по текущему объекту DirectoryInfo new CreateSubdirectory() CreateSubdirectory() - создание подпапки текущего каталога Delete() Delete() – удаление текущей папки MoveTo () MoveTo () – перемещение текущей папки Directory Класс Directory имеет практически такие же методы, но в статическом исполнении Directory.CreateDirectory(path);
FileInfo Экземпляр FileInfo представляет один файл файловой системы Наследник от FileSystemInfo Создание объекта ( но не физического файла на диске ) FileInfo file = new FileInfo(c:\\test.txt); Свойства ( в добавление к свойствам FileSystemInfo) DirectoryDirectoryName Directory, DirectoryName – папка DirectoryInfo или полное имя папки ( с полным путем ) IsReadOnly IsReadOnly – файл только для чтения Length Length – размер файла в байтах Операции с файлами целиком Create()CreateText() Create(), CreateText() – создание файла CopyTo() CopyTo() – копирование файла Delete() Delete() – удаление текущего файла MoveTo () MoveTo () – перемещение текущего файла Операции с содержимым файла Create()CreateText()OpenRead()OpenText()OpenWrite()AppendText() Create(), CreateText(), OpenRead(), OpenText(), OpenWrite(), AppendText() File Класс File имеет практически такие же методы, но в статическом исполнении File.Delete(c:\\myText.txt);
Работа с файлами каталогами
Stream Представляет файл, порт и т. д. как поток байт Абстрактный класс Запись, чтение, перемещение указателя Реализация конкретных потоков в наследниках Классы обертки. Reader / Writer Чтение из / запись в поток BinaryReader/BinaryWriter – бинарные чтение / запись StreamReader/StreamWriter – текстовые чтение / запись Понятие кодировки (Encoding)
Возможности CanRead – можно ли читать CanWrite – можно ли писать CanSeek – можно ли двигать курсор Чтение int Read(byte[] buffer, int offset, int count) Запись void Write(byte[] buffer, int offset, int count) Текущая позиция long Position {get; set; } Перемещение long Seek(long offset, SeekOrigin origin); Закрытие потока void Close() void Dispose()
Stream PipeStream Поток данных из именованных каналов FileStream поток из файла MemoryStream поток из памяти SqlFileStream NetworkStream поток из сети UnmanagedMemoryStream поток неуправляемых данных …
CryptoStream CryptoStream – предоставляет шифрование потока BufferedStream BufferedStream – добавляет буферизацию GZipStreamDeflateStream GZipStream, DeflateStream – предоставляют возможность сжатия потока BinaryReader/BinaryWriter StreamReader/StreamWriter BinaryReader/BinaryWriter, StreamReader/StreamWriter – предоставляют удобные способы чтения / записи в поток
Классы обертки. Оборачивают конкретный поток Бинарный доступ к потоку Чтение / запись встроенных типов ReadXXX() / WriteXXX() XXX = Int32, Single, Double, … « Подсмотреть » следующий символ PeekChar() Кодировка по умолчанию UTF8
Классы обертки. Оборачивают конкретный поток Текстовый доступ к потоку Чтение / запись строк ReadLine() – чтение строки ReadToEnd() – сразу весь файл Write() – запись строки WriteLine() – запись строки + символ новой строки Параметры аналогичны функциям консоли
System.Text.Encoding Определяет преобразование char (Unicode) byte [] Encoding GetEncoding() получает кодировку по Имени : GetEncoding(windows-1251) Номеру : GetEncoding(1251) Использование : StreamReader sr = new StreamReader(stream, Encoding.Unicode);
TextReader/TextWriter – базовые классы StreamReader/StreamWriter – из потока StringReader/StringWriter – из строки Стандартные потоки Console.In – поток ввода Console.Out – поток вывода Console.Error – поток ошибок
Текстовый ввод - вывод
Атрибуты Работа с файлами Сериализация
Сериализация – процесс сохранения состояния объекта в потоке Сохраняются данные и необходимая информация для реконструкции объекта – десериализации При сериализации Сохраняется граф объектов Сохраняются данные и всех базовых классов Использование Сохранение данных программы ( например, настройки ) Передача объектов по сети Персистентные объекты ( время жизни объекта больше времени работы программы )
Двоичный Компактный Для десериализации нужен.NET SOAP Стандарт W3C.org Не зависит от платформы Многословен XML Произвольный XML формат Не зависит от платформы Многословен. Полностью настраиваемый
Только для двоичного и SOAP форматов С помощью атрибутов [Serializable] [Serializable] – указывает на то, что тип можно сериализовать [Serializable] class Complex {….} Что сериализуется Все публичные и приватные поля ( и автоматические свойства ) Базовые и используемые типы тоже должны быть сериализуемыми, т. е. иметь атрибут [Serializable] [NonSerialized] [NonSerialized] – помечается поле или автоматическое свойство, если что - то сериализовать не нужно [Serializable] struct Complex { double im, re; [NonSerialized] double mod, arg;}
Форматеры BinaryFormatter BinaryFormatter – для бинарной сериализации (System.Runtime.Serialization.Formatters.Binary.Bina ryFormatter) SoapFormatter SoapFormatter – для сериализации в SOAP фомате (System.Runtime.Serialization.Formatters.Soap.SoapF ormatter) XmlSerializer XmlSerializer – для сериализации в произвольный формат (System.Xml.Serialization.XmlSerializer)
Для BinaryFormatter и SoapFormatter Serialize Serialize(stream, obj) – сериализация объекта в поток Complex complex = new Complex(10, 20); using (FileStream stream = new FileStream("store.bin", FileMode.Create)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(stream, complex); } Deserialize object Deserialize(stream) – для десериализации объекта Complex complex; using (FileStream stream = new FileStream("store.bin", FileMode.Open)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); complex = (Complex)binaryFormatter.Deserialize(stream); } Для XmlSerializer необходимо указать сериализуемый тип (- ы ) XmlSerializer serializer = new XmlSerializer(typeof(Complex)); XmlSerializer serializer = new XmlSerializer(typeof(Car), new Type[] { typeof(Radio) });
Сериализация только публичных полей и свойств ( приватных полей, стоящих за ними ) Должен быть конструктор без параметров Атрибуты настройки вида XML [XmlIgnore] [XmlAttribute] [XmlElement] [XmlText] И др.
Сериализация