Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Таблица 17.1.Атрибуты пространства имен System.Xml.Serialization, связанные с сериализацией объектов
Атрибут | Описание |
---|---|
XmlAttributeAttribute | Член будет сохранен в виде XML-атрибута |
XmlElementAttribute | Поле или свойство будут сохранены в виде XML-элемента |
XmlEnumAttribute | Имя элемента перечня |
XmlRootAttribute | Атрибут, контролирующий формат корневого элемента (пространство имен и имя элемента) |
XmlTextAttribute | Свойство или поле должно сохраняться в виде XML-текста |
XmlTypeAtttribute | Имя и пространство имен XML-типа |
Для примера давайте сначала выясним, как поля данных JamesBondCar сохраняются в XML-документе в настоящий момент.
‹?xml version="1.0" encodings="utf-8"?›
‹JamesBondCar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=http://www.w3.org/2001/XMLSchema›
…
‹canFly›true‹/canFly›
‹canSubmerge›false ‹/ canSubmerge›
‹ /JamesBondCar›
Если вы хотите указать пользовательское пространство имен XML, соответствующее JamesBondCar, и кодировать значения canFly и canSubmerge в виде XML-атрибутов, это можно сделать с помощью изменения определения JamesBondCar в C# следующим образом.
[ Serializablе, XmlRoot(Namespace = "http://www.intertechtraining.com")]
public class JamesBondCar: Car {
…
[XmlAttribute]
public bool canFly;
[XmlAttribute]
public bool canSubmerge;
}
Это должно дать в результате следующий XML-документ (обратите внимание на открывающий элемент ‹JamesBondCar›).
‹?xml version="1.0" encodin="utf-8"?›
‹JamesBondCar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" canFly="true" canSubmerge="false"
xmlns="http://www.intertechtraining.com"›
…
‹/JamesBondCar›"
Конечно, есть множество других атрибутов, которые вы можете использовать для управления процессом генерирования XML-документа с помощью XmlSerializer. Чтобы ознакомиться со всеми опциями, выполните поиск информации о пространстве имен System.Xml.Serialization в документации .NET Framework 2.0 SDK
Сохранение коллекций объектов
Теперь вы знаете, как сохранить в потоке отдельный объект, и давайте выясним, как сохранить множество объектов. Заметим, что метод Serialize() интерфейса IFormatter не позволяет указать произвольное число объектов (а только один System.Object). Аналогично, возвращаемым значением Deserialize() тоже является один System.Object.
public interface IFormatter{
…
objectDeserialize(System.IO.Stream serializationStream);
void Serialize(System.IO.Stream serializationStream, object graph);
}
Напомним, что System.Object фактически представляет весь объектный граф. Поэтому при передаче объекта, обозначенного атрибутом [Serializable] и содержащего другие объекты [Serializable], будет сохранен сразу весь набор объектов. Большинство типов, находящихся в рамках пространства имен System.Collections и System.Collections.Generic, уже обозначены атрибутом [Serializable]. Таким образом, чтобы сохранить набор объектов, просто добавьте этот набор в контейнер (например, в ArrayList или List‹›) и выполните сериализацию полученного объекта в подходящий поток.
Предположим, что в класс JamesBondCar был добавлен конструктор с двумя аргументами, чтобы можно было установить некоторые начальные данные состояния (обратите внимание на то, что конструктор, заданный по умолчанию, был возвращен на место в соответствии с требованиями XmlSerializer),
[Serializable,
XmlRoot(Namespace = "http://www.intartechtraining.com")]
public class JamesBondCar: Car {
public JamesBondCar(bool skyWorthy, bool seaWorthy) {
canFly = skyWorthy; canSubmerge = seaWorthy;
}
// Для XmlSerializer нужен конструктор, заданный по умолчанию!
public JamesBondCar(){}
…
}
При этом вы сможете сохранить любое число объектов JamesBondCar так.
static void Main(string[] args) {
…
// Сохранение объекта List‹› с набором JamesBondCar.
List‹JamesBondCar› myCars = new List‹JamesBondCar›();
myCars.Add(new JamesBondCar(true, true));
myCars.Add(new JamesBondCar(true, false));
myCars.Add(new JamesBondCar(false, true));
myCars.Add(new JamesBondCar(false, false));
fStream = new FileStream("CarCollection.xml", FileMode.Create, FileAccess.Write, FileShare.None);
xmlFormat = new XmlSerializer(typeof(List‹JamesBondCar›), new Type[] {typeof(JamesBondCar), typeof(Car), typeof(Radio)});
xmlFormat.Serialize(fStream, myCars);
fStream.Close();
Console.ReadLine();
}
Снова обращаем внимание на то, что по причине использования XmlSerializer требуется указать информацию типа для каждого из объектов, вложенных в корневой объект (которым в данном случае является List‹›). При использовании BinaryFormatter или SoapFormatter программная логика будет еще проще.
statiс void Main (string[] args) {
…
// Сохранение объекта List‹›(myCars) в двоичном формате.
list‹JamesBondCar› myCars = new List‹JamesBondCar›();
…
BinaryFormatter binFormat = new BinaryFormatter();
Stream fStream = new FileStream("AllMyCars.dat", FileMode.Create, FileAccess.Write, FileShare.None);
binFormat.Serialize(fStream, myCars);
fStream.Close();
Console.ReadLine();
}
Превосходно! К этому моменту вам должно быть понятно, как использовать сервис сериализации объектов для упрощения процесса сохранения и восстановления данных вашего приложения. Теперь давайте выясним, как использовать пользовательские настройки процесса сериализации.
Исходный код. Проект SimpleSerialize размещен в подкаталоге, соответствующем главе 17.
Настройка процесса сериализации
В большинстве случаев типовая схема сериализации, предлагаемая платформой .NET, будет именно тем, что требуется. Тогда нужно просто применить атрибут [Serializable] и передать объектный граф выбранному средству форматирования. Но в некоторых случаях может потребоваться корректировка того, как обрабатывается объектный граф в процессе сериализации. Например, в соответствии с внутренними правилами вашей компании все поля данных должны сохраняться в формате верхнего регистра или, возможно, вы хотите добавить в поток дополнительные элементы данных, которые не проецируются непосредственно в поля сохраняемого объекта (это могут быть штампы времени, уникальные имена или что-то иное).
Для непосредственного участия в управлении процессом сериализации объектов пространство имен System.Runtime.Serialization предлагает специальные типы. В табл. 17.2 описаны те из них, о которых вам следует знать.
Таблица 17.2.Основные типы пространства имен System.Runtime.Serialization
Тип | Описание |
---|---|
ISerializable | В .NET 1.1 реализация этого интерфейса была наиболее предпочтительным методом пользовательской сериализации объектов. В .NET 2.0 для настройки параметров процесса сериализации предпочтительнее использовать новое множество атрибутов (они будут описаны чуть позже) |
ObjectIDGenerator | Тип, генерирующий идентификаторы элементов объектного графа |
OnDeserializedAttribute | Атрибут .NET 2.0, позволяющий указать метод, который вызывается сразу же после выполнения реконструкции объекта |
OnDeserializingAttribute | Атрибут .NET 2.0, позволяющий указать метод, который вызывается в процессе выполнения реконструкции объекта |
OnSerializedAttribute | Атрибут .NET 2.0, позволяющий указать метод, который вызывается сразу же после выполнения сериализации объекта |
OnSerializingAttribute | Атрибут .NET 2.0, позволяющий указать метод, который вызывается в процессе сериализации |
OptionalFieldAttribute | Атрибут .NET 2.0, позволяющий указать поле типа, которое может отсутствовать в указанном потоке |
SerializationInfo | По сути, этот класс является "чемоданом свойств", содержащим пары имен и значений, представляющих состояние объекта в процессе сериализации |
Более глубокий взгляд на сериализацию объектов
Интервал:
Закладка: