Симон Робинсон - C# для профессионалов. Том II
- Название:C# для профессионалов. Том II
- Автор:
- Жанр:
- Издательство:Лори
- Год:2003
- Город:Москва
- ISBN:5-85582-187-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Симон Робинсон - C# для профессионалов. Том II краткое содержание
Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.
В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.
Для кого предназначена эта книгаЭта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.
Основные темы книги• Все особенности языка C#
• C# и объектно-ориентированное программирование
• Приложения и службы Windows
• Создание web-страниц и web-служб с помощью ASP NET
• Сборки .NET
• Доступ к данным при помощи ADO NET
• Создание распределённых приложений с помощью NET Remoting
• Интеграция с COM, COM+ и службой Active Directory
C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// необходимо иметь запись атрибута для каждого типа данных
[XmlArrayItem("Prod", typeof(Product)), XmlArrayItem("Book", typeof(BookProduct))]
//public Inventory(Product [] InventoryItems) {
// stuff=InventoryItems;
//}
public Product[] InventoryItems {
get {return stuff;}
set {stuff=value;}
}
}
//класс Product
public class Product {
private int prodId;
private string prodName;
private int suppId;
public Product() {}
public int ProductID {
get {return prodId;}
set {prodId=value;}
}
public string ProductName {
get {return prodName;}
set {prodName=value;}
}
public int SupplierID {
get {return suppId;}
set {suppId=value;}
}
}
// Класс Bookproduct
public class BookProduct: Product {
private string isbnNum;
public BookProduct() {}
public string ISBN {
get {return isbnNum;}
set {isbnNum=value;}
}
}
В этот пример добавлено два новых класса. Класс Inventory
будет отслеживать то, что добавляется на склад. Можно добавлять продукцию на основе класса Product
или класса BookProduct
, который расширяет Product
. В классе Inventory
содержится массив добавленных объектов и в нем могут находиться как BookProducts
, так и Products
. Вот как выглядит документ XML:
100
Product Thing
10
101
How to Use Your New Product Thing
10
123456789
Все это работает прекрасно, но как быть в ситуации, когда нет доступа к исходному коду типов, которые будут сериализироваться? Невозможно добавить атрибут, если отсутствует исходный код. Существует другой способ. Можно воспользоваться классами XmlAttributes
и XmlAtrtributeOverrides
. Вместе эти классы позволят выполнить в точности то, что только что было сделано, но без добавления атрибутов. Вот пример, находящийся в папке SerialSample4
:
private void button1_Click(object sender, System.EventArgs e) {
// создать объект XmlAttributes 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);
// создать объекты Product и Book
Product newProd=new Product();
BookProduct newBook=new BookProduct();
newProd.ProductID=100;
newProd.ProductName="Product Thing";
newProd.SupplierID=10;
newBook.ProductID=101;
newBook.ProductName="How to Use Your New Product Thing";
newBook.SupplierID=10;
newBook.ISBN="123456789";
Product[] addProd={newProd, newBook};
//Product[] addProd={newBook};
Inventory inv=new Inventory();
inv.InventoryItems=addProd;
TextWriter tr=new StreamWriter("..\\..\\..\\inventory.xml");
XmlSerializer sr=new XmlSerializer(typeof(Inventory), attrOver);
sr.Serialize(tr, inv);
tr.Close();
}
private void button2_Click(object sender, System.EventArgs e) {
//необходимо выполнить тот же процесс для десериализации
// создаем новую коллекцию XmlAttributes
XmlAttributes attrs=new XmlAttributes();
// добавляем информацию о типе к коллекции элементов
attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));
attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));
XmlAttributeOverrides attrOver=new XmlAttributeOverrides();
//добавляем к коллекции Attributes (атрибутов)
attrOver.Add(typeof(Inventory), "InventoryItems", attrs);
//нужен новый объект Inventory для десериализаций в него
Inventory newInv;
// десериализуем и загружаем данные в окно списка из
// десериализованного объекта
FileStream f=new FileStream("..\\..\\..\\inventory.xml", FileMode.Open);
XmlSerializer newSr=new XmlSerializer(typeof(Inventory).attrOver);
newInv=(Inventory)newSr.Deserialize(f);
if (newInv!=null) {
foreach(Product prod in newInv.InventoryItems) listBox1.Items.Add(prod.ProductName);
}
f.Close();
}
// это те же классы, что и в предыдущем примере
// за исключением удаленных атрибутов
// из свойства InventoryItems для Inventory
public class Inventory {
private Product[] stuff;
public Inventory() {}
public Product[] InventoryItems {
get {return stuff;}
set {stuff=value;}
}
}
public class Product {
private int prodId;
private string prodName;
private int suppId;
public Product() {}
public int ProductID {
get {return prodId;}
set {prodId=value;}
}
public string ProductName {
get {return prodName;}
set {prodName=value;}
}
public int SupplierID {
get {return suppId;}
set {suppId=value;}
}
}
public class BookProduct:Product {
private string isbnNum;
public BookProduct() {}
public string ISBN {
get {return isbnNum;}
set {isbnNum=value;}
}
}
Это тот же пример, что и раньше, но первое, что необходимо заметить,— здесь нет добавленных в класс Inventory
атрибутов. Поэтому в данном случае представьте, что классы Inventory
, Product
и производный класс BookProduct
находятся в отдельной DLL, и у нас нет исходного кода.
Первым шагом в процессе является создание объекта на основе XmlAttributes
, и объекта XmlElementAttribute
для каждого типа данных, который будет переопределяться:
XmlAttributes attrs=new XmlAttributes();
attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));
attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));
Здесь мы добавляем новый XmlElementAttribute
к коллекции XmlElements
класса XmlAttributes
. Класс XmlAttributes
имеет свойства, соответствующие атрибутам, которые могут применяться; XmlArray
и XmlArrayItems
, которые мы видели в предыдущем примере, являются только парой. Теперь мы имеем объект XmlAttributes
с двумя объектами на основе XmlElementAttribute
, добавленными к коллекции XmlElements
. Далее создадим объект XmlAttributeOverrides
:
XmlAttributeOverrides attrOver = new XmlAttributeOverride();
attrOver.Add(typeof(Inventory) , "Inventory Items", attrs);
Meтод Add
имеет две перегружаемые версии. Первая получает информацию о типе переопределяемого объекта и объект XmlAttributes
, который был создан ранее. Вторая версия та, что мы используем, получает также с строковое значение, которое является членом в переопределенном объекте. В нашем случае мы хотим переопределить член InventoryItems
в классе Inventory
.
Теперь создадим объект XmlSerializer
, добавляя объект XmlAttributeOverrides
в качестве параметра. XmlSerializer
уже знает, какие типы мы хотим переопределить и что нам нужно вернуть для этих типов. Если выполнить метод Serialize
, то получится следующий вывод XML:
100
Product Thing
10
101
How to Use Your New Product Thing
10
123456789
Мы получили тот же самый XML, что и в предыдущем примере. Чтобы десериализовать этот объект и воссоздать объект на основе Inventory, с которого мы начали, необходимо создать все те же объекты XmlAttributes
, XmlElementAttribute
и XmlAttributeOverrides
, которые создаются при сериализации объекта. Когда это будет сделано, можно прочитать XML и воссоздать объект Inventory
, как это делалось раньше. Вот код для десериализации объекта Inventory
:
Интервал:
Закладка: