- •1. Язык программирования c# 3
- •2. Базовые элементы .Net Framework 67
- •3. ТЕхнология .Net Remoting 144
- •Введение
- •1. Язык программирования c#
- •1.1. Платформа .Net – обзор архитектуры
- •1.2. Язык c# - общие концепции синтаксиса
- •1.3. Система типов языка c#
- •1.4. Преобразования типов
- •1.5. Идентификаторы, ключевые слова и литералы
- •1.6. Объявление переменных, полей и констант
- •1.7. Выражения и операции
- •1.8. Операторы языка c#
- •1.9. Объявление и вызов методов
- •1.10. Массивы в c#
- •1.11. Работа с символами и строками в c#
- •1.12. Синтаксис объявления класса, Поля и методы класса
- •1.13. Свойства и индексаторы
- •1.14. Конструкторы класса и Жизненный цикл объекта
- •1.15. Наследование классов
- •1.16. Перегрузка операЦий
- •1.17. Делегаты
- •1.18. События
- •1.19. Интерфейсы
- •1.20. Структуры и перечисления
- •1.21. Пространства имен
- •1.22. Генерация и обработка исключительных ситуаций
- •1.23. Нововведения в языке c# 2.0
- •1.24. Обобщенные типы (generics)
- •2. Базовые элементы .Net Framework
- •2.1. Метаданные и механизм отражения
- •2.2. Пользовательские и встроенные атрибуты
- •2.3. Пространство имен system.Collections
- •2.4. Работа с файлами и директориями
- •2.5. Использование потоков данных
- •2.6. Сериализация
- •2.7. Сериализация объектов в нестандартном формате
- •2.8. Введение в xml
- •2.9. Работа с xml-документами в .Net framework
- •2.10. МНогопоточное программирование
- •2.11. Синхронизация потоков
- •2.12. Асинхронный вызов методов
- •2.13. Состав и взаимодействие сборок
- •2.14. Конфигурирование сборок
- •3. ТЕхнология .Net Remoting
- •3.1. Домены приложений
- •3.2. Архитектура .Net Remoting
- •3.3. Активация удаленных объектов и их время жизни
- •3.4. Программная настройка Remoting
- •3.5. Удаленные Объекты с клиентской активацией
- •3.6. Настройка Remoting при помощи конфигурационных файлов
- •3.7. Хостинг распределенных приложений
- •3.8. Объекты-сообщения
- •3.9. Пользовательские канальные приемники
- •4.1. Архитектура ado.Net
- •4.2. Учебная база cd Rent
- •4.3. Соединение с базой данных
- •4.4. Выполнение команд и запросов к базе данных
- •4.5. Чтение данных и объект DataReader
- •4.6. Параметризированные запросы
- •4.7. Рассоединенный набор данных
- •4.8. Заполнение Рассоединенного набора данных
- •4.9. Объект класса DataColumn – колонка таблицы
- •4.10. Объекты класса DataRow – строки таблицы
- •4.11. Работа с объектом класса DataTable
- •4.12. DataSet и схема рассоединенного набора данных
- •4.13. Типизированные DataSet
- •4.14. Поиск и фильтрация данных в DataSet
- •4.15. Класс DataView
- •4.16. СиНхронизация набора данных и базы
- •5.1. Архитектура и общие концепции asp.Net
- •5.2. Пример aspx-страницы. Структура страницы
- •5.3. Директивы страницы
- •5.4. Класс System.Web.Ui.Page. События страницы
- •5.5. Серверные элементы управления
- •5.6. Элементы управления Web Controls
- •5.7. Проверочные элементы управления
- •5.8. Списковые элементы управления
- •5.9. Связывание данных
- •5.11. Управление состояниями в web-приложениях
- •5.12. Кэширование
- •5.13. Безопасность в web-приложениях
- •5.14. Создание пользовательских элементов управления
- •Литература
2.7. Сериализация объектов в нестандартном формате
Если программиста не устраивают существующие форматы сериализации или способ организации потока сериализованных данных, он может осуществить сериализацию в собственном формате. Классы, помеченные атрибутом [Serializable], могут дополнительно реализовывать интерфейс ISerializable. Это позволяет «вклиниться» в процесс сериализации и выполнить любые действия, связанные с формированием данных для сохранения.
Интерфейс ISerializable устроен просто:
public interface ISerializable {
void GetObjectData(SerializationInfo info,
StreamingContext context);
}
Метод GetObjectData() вызывается форматером автоматически при выполнении сериализации. Реализация данного метода подразумевает заполнение объекта SerializationInfo набором данных вида «ключ-значение», которые (обычно) соответствуют полям сохраняемого объекта. Класс SerializationInfo содержит несколько перегруженных версий метода AddValue(), а также свойства для указания имени типа, имени сборки и т.п. Фрагмент определения класса SerializationInfo приведен ниже:
public sealed class SerializationInfo {
public SerializationInfo(Type type,
IFormatterConverter converter);
public string AssemblyName { get; set; }
public string FullTypeName { get; set; }
public int MemberCount { get; }
public void AddValue(string name, short value);
public void AddValue(string name, UInt16 value);
public void AddValue(string name, int value);
. . .
}
Если тип реализовывает интерфейс ISerializable, то он должен также содержать специальный конструктор:
[Serializable]
class SomeClass : ISerializable {
// Конструктор с такой сигнатурой необходим,
// чтобы CLR смогла восстановить состояние объекта
private SomeClass(SerializationInfo si,
StreamingContext ctx) { . . . }
. . .
}
Обратите внимание: конструктор объявлен с модификатором private. Первый параметр конструктора – это объект класса SerializationInfo. Второй параметр имеет тип StreamingContext. Наиболее часто используемым элементом данного класса является свойство State из перечисления StreamingContextStates.
Для иллюстрации использования интерфейса ISerializable предположим, что у нас определен класс с двумя текстовыми полями. Далее, пусть требуется сохранять эти поля в верхнем регистре, а считывать в нижнем регистре. Вот код, который выполняет требуемую сериализацию (не забудьте подключить пространство имен System.Runtime.Serialization):
[Serializable]
class MyStringData : ISerializable {
public string dataItemOne, dataItemTwo;
public MyStringData(){}
private MyStringData(SerializationInfo si,
StreamingContext ctx) {
// Получаем значения из потока и преобразовываем их
dataItemOne = si.GetString("First_Item").ToLower();
dataItemTwo = si.GetString("dataItemTwo").ToLower();
}
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext ctx) {
// Заполняем объект SerializationInfo
info.AddValue("First_Item", dataItemOne.ToUpper());
info.AddValue("dataItemTwo", dataItemTwo.ToUpper());
}
}
Как видим, в конструкторе типа сериализованные значения извлекаются при помощи метода GetString(). В классе SerializationInfo существуют аналогичные методы для других типов данных.
Во второй версии .NET Framework для поддержки собственных форматов сериализации существует ряд атрибутов: [OnSerializing], [OnSerialized], [OnDeserializing], [OnDeserialized]. Этими атрибутами помечаются методы класса. Механизм сериализации будет автоматически вызывать помеченный метод в требуемый момент. Метод, который помечается одним из вышеуказанных атрибутов, должен принимать в качестве параметра объект класса StreamingContext и не возвращать значений.
Для иллюстрации пользовательской сериализации с применением атрибутов рассмотрим класс MoreData, который при сериализации ведет себя аналогично классу MyStringData.
[Serializable]
class MoreData {
public string dataItemOne, dataItemTwo;
// Если метод помечен атрибутом [OnSerializing], то он
// вызывается перед записью данных в поток
[OnSerializing]
internal void OnSerializing(StreamingContext context) {
dataItemOne = dataItemOne.ToUpper();
dataItemTwo = dataItemTwo.ToUpper();
}
// Если метод помечен атрибутом [OnDeserialized], то он
// вызывается после чтения данных из потока
[OnDeserialized]
internal void OnDeserialized(StreamingContext context) {
dataItemOne = dataItemOne.ToLower();
dataItemTwo = dataItemTwo.ToLower();
}
}