KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

Симон Робинсон - C# для профессионалов. Том II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

Meтод Add имеет две перегружаемые версии. Первая получает информацию о типе переопределяемого объекта и объект XmlAttributes, который был создан ранее. Вторая версия та, что мы используем, получает также с строковое значение, которое является членом в переопределенном объекте. В нашем случае мы хотим переопределить член InventoryItems в классе Inventory.

Теперь создадим объект XmlSerializer, добавляя объект XmlAttributeOverridesв качестве параметра. XmlSerializer уже знает, какие типы мы хотим переопределить и что нам нужно вернуть для этих типов. Если выполнить метод Serialize, то получится следующий вывод XML:

<?xml version="1.0"?>

<Inventory xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 <Products>

  <ProductID>100</ProductID>

  <ProductName>Product Thing</ProductName>

  <SupplierID>10</SupplierID>

 </Product>

 <Book>

  <ProductID>101</ProductID>

  <ProductName>How to Use Your New Product Thing</ProductName>

  <SupplierID>10</SupplierID>

  <ISBN>123456789</ISBN>

 </Book>

</Inventory>

Мы получили тот же самый XML, что и в предыдущем примере. Чтобы десериализовать этот объект и воссоздать объект на основе Inventory, с которого мы начали, необходимо создать все те же объекты XmlAttributes, XmlElementAttribute и XmlAttributeOverrides, которые создаются при сериализации объекта. Когда это будет сделано, можно прочитать XML и воссоздать объект Inventory, как это делалось раньше. Вот код для десериализации объекта Inventory:

private void button2_Click(object sender, System.EventArgs e) {

 XmlAttributes attrs=new XmlAttributes();

 attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));

 attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));

 XmlAttributeOverrides attrOver=new XmlAttributeOverrides();

 attrOver.Add(typeof(Inventory), "InventoryItems", attrs);

 Inventory newInv;

 FileStream f=new FileStream("..\..\..\inventory.xml", FileMode.Open);

 XmlSerializer newSr=new XmlSerializer(typeof(Inventory), attrOver);

 newInv=(Inventory)newSr.Deserialize(f);

 foreach(Product prod, in newInv.InventoryItems) listBox1.items.Add(prod.ProductName);

 f.Close();

}

Отметим, что первые несколько строк кода идентичны коду, который использовался для сериализации объекта.

Пространство имен XmlSerialize предоставляет мощный набор инструментов. Сериализуя объекты в XML, а не в двоичный формат, мы получаем дополнительные возможности, что может действительно увеличить гибкость проектирования.

Заключение

В этой главе рассматривались широкие возможности пространства имен System.Xml платформы .NET. Было показано, как прочитать и записать документы XML с помощью классов на основе XMLReader и XMLWriter, как в .NET реализована DOM и как использовать возможности DOM. Мы увидели, что XML и ADO.NET действительно очень тесно связаны. DataSet и документ XML являются двумя различными представлениями одной и той же базовой архитектуры. Мы сериализовали объекты в XML и смогли вернуть их обратно с помощью вызова пары методов. Комбинация Reflection и XMLSerilization приводит к некоторым уникальным конструкциям. И, конечно, были рассмотрены XPath и XslTransform. В течение ближайших нескольких лет XML станет, если уже не стал, важной частью разработки приложений. Платформа .NET сделала доступным мощный набор инструментов для работы с XML. 

Глава 14

Операции с файлами и реестром

В этой главе будет рассмотрено выполнение в C# задач, включающих чтение и запись в файлы и в системный реестр. В частности, будут охвачены следующие вопросы:

□ Исследование структуры каталога, выяснение, какие файлы и папки присутствуют и проверка их свойств

□ Перемещение, копирование и удаление файлов и папок

□ Чтение и запись текста в и из файлов

□ Чтение и запись в реестр

Компания Microsoft предоставила очень интуитивную объектную модель, охватывающую эти области, и в ходе этой главы мы покажем, как использовать классы на основе .NET для выполнения упомянутых выше задач. Для случая операций с файловой системой соответствующие классы почти все находятся в пространстве имен System.IO, в то время как операции с реестром связаны с парой классов в пространстве имен System.Win32.

Классы на основе .NET включают также ряд классов и интерфейсов в пространстве имен System.Runtime.Serilization, которые связаны с сериализацией, то есть процессом преобразования некоторых данных (например, содержимого документа) в поток байтов для хранения в каком либо месте. Мы не будем рассматривать эти классы в данной главе, так как сосредоточимся на классах, которые предназначены для прямого доступа к файлам.

Отметим, что хотя безопасность влияет на все области, но особенно она важна при модификации файлов или записей реестра. Система безопасности рассматривается отдельно в главе 25. В этой главе мы будем предполагать, что имеются достаточные права доступа для выполнения всех примеров, которые модифицируют файлы или записи реестра, что обеспечивается, например, при использовании учетной записи с полномочиями администратора.

Управление файловой системой 

Классы, которые используются для просмотра файловой системы и выполнения таких операций, как перемещение, копирование и удаление файлов, показаны на следующей диаграмме. Пространство имен каждого класса показано в скобках под именем каждого класса на диаграмме:

Назначение этих классов следующее:

□ System.MarshalByRefObject — класс базового объекта для классов .NET, которые являются удаленными. Допускает маршализацию данных между прикладными доменами.

□ FileSystemInfo — базовый класс, который представляет любой объект файловой системы.

□ FileInfo и File — представляют файл в файловой системе.

□ DirectoryInfo и Directory — представляют папку в файловой системе.

□ Path — содержит статические члены, которые можно использовать для манипуляций именами путей доступа.

Отметим, что в Windows объекты, которые содержат файлы и используются для организации файловой системы, называются папками. Например, в пути доступа C:My DocumentsReadMe.txt файлом является ReadMe.txt, а My Documents — папкой. Папка (folder) является специфическим для Windows терминам: практически во всех других операционных системах вместо папки используется термин каталог (directory). В соответствии с желанием Microsoft, чтобы .NET была максимально независимой от операционной системы, соответствующие базовые классы .NET называются Directory и DirectoryInfo. Однако в связи с возможной путаницей с каталогами LDAP (обсуждаемыми в главе 15), и в связи с тем, что эта книга посвящена Windows, здесь используется термин папка.

Классы .NET, представляющие файлы и папки

Из приведенного выше списка можно видеть, что существуют два класса, используемых для представления папки, и два класса для файла. Какой из этих классов будет наиболее подходящим, зависит в большой степени от того, сколько раз необходимо получать доступ к папке или файлу:

□ Directory и File содержат только статические методы и никогда не создают экземпляров. Эти классы применяются с помощью предоставления пути доступа к соответствующему объекту файловой системы, когда вызывается метод-член. Если нужно выполнить только одну операцию на папке или файле, то эти классы более эффективны, так как не требуют создания экземпляра класса .NET.

□ DirectoryInfo и FileInfo реализуют приблизительно те же открытые методы, что и Directory и File, а также некоторые открытые свойства и конструкторы, но они имеют состояние и члены этих классов не являются статическими. На самом деле необходимо создать экземпляры этих классов, и при этом каждый экземпляр ассоциируется с определенной папкой или файлом. Это означает, что эти классы являются более эффективными, если выполняется несколько операций с помощью одного и того же объекта, так как они будут считывать аутентификационные и другие данные при создании соответствующего объекта файловой системы, а затем им не понадобиться больше считывать эту информацию, независимо от того, сколько методов вы будете вызывать на каждом объекте (экземпляре класса). Для сравнения, соответствующим классам без состояния понадобиться снова проверять данные файла или папки для каждого вызываемого метода.

В этом разделе мы будем в основном использовать классы FileInfo и DirectoryInfo, но оказывается, что многие (но не все) вызываемые методы реализуются также классами File и Directory (хотя в этих случаях эти методы требуют дополнительный параметр, имя пути доступа объекта файловой системы и пара методов имеют немного отличные имена). Например:

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*