Программирование >>  Программирование с использованием ajax 

1 ... 315 316 317 [ 318 ] 319 320 321 ... 396


Этот класс успешно используется в течение ряда лет, но затем появляется некая новая функциональная возможность, приходящая на смену старой:

public void CodelnCSharp ()

Естественно, желательно, чтобы пользователи вашей библиотеки в течение некоторого времени продолжали применять метод CodelnCPlusPlus О , но хотелось бы поставить их в известность о наличии более нового метода, отображая во время компиляции предупреждающее сообщение, информирующее о существовании метода CodelnCSharp (). Для этого достаточно добавить атрибут Obsolete, как показано в следующем примере:

[Obsolete( CodelnCSharp instead. )]

public void CodelnCPlusPlus ()

Теперь при компиляции для отладки или создания окончательной версии компилятор С# отобразит предупреждение об использовании устаревшего (или вскоре ставшего таковым) метода, как показано на рис. 30.6. Обычно предупреждения не будут останавливать работу компилятора, если только не установить опцию Treat warnings as errors (Обрабатывать предупреждения как ошибки) на вкладке Build страницы настроек конфигурации проекта - эту вкладку можно открыть, выбирая пункт меню Properties проекта.


D cnption

Рис. 30.6. Предупреждение об использовании устаревшего метода

Со временем пользователям надоест читать это предупреждающее сообщение при каждой компиляции кода, поэтому постепенно все (или почти все) пользователи начнут использовать метод CodelnCSharp (). Рано или поздно вы решите полностью отказаться от поддержки метода CodelnCPlusPlus (), поэтому к атрибуту Obsolete нужно добавить дополнительный параметр:

[Obsolete ( You must CodelnCSharp instead. , true) ]

public void CodelnCPlusPlus0

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

Этот способ управления версиями не слишком подходит для двоичных классов, таких как компоненты, приобретенные без исходного кода - каркас .NET Framework предлагает прекрасные встроенные возможности управления версиями. Однако атрибут Obsolete предоставляет удобный способ сообщения о том, что конкретная функциональная возможность классов больше не должна использоваться.



System. SerializableAttribute

Сериализация (serialization) - это термин, обозначающий способ хранения и извлечения объекта из дискового файла, памяти или любого другого источника. Когда объект сериализован, все данные экземпляра постоянно сохраняются на носителе хранилища, а если он десериализован, объект реконструируется и по существу совпадает с исходным экземпляром.

Любой, кому раньше доводилось программировать с применением MFC, ATL или VB и нужно было беспокоиться о сохранении и извлечении данных экземпляров, убедится, что этот атрибут значительно уменьшит объем ввода с клавиатуры. Предположим, что существует класс С#, подобный следующему, который нужно хранить в файле:

public class Person

public Person

public int Age { get; set; };

public int WeightlnPounds { get; set; };

В C# (и в любом языке, построенном на основе .NET Framework) члены экземпляра можно сериализовать без написания - или почти без написания - какого-то кода. Достаточно добавить к классу атрибут Serializable, и модуль времени выполнения .NET выполнит все остальные необходимые действия.

Когда модуль времени выполнения получает запрос на сериализацию объекта, он проверяет, реализует ли класс объекта интерфейс ISerializable. Если нет, модуль времени выполнения проверяет, снабжен ли класс атрибутом Serializable. Мы не будем подробно останавливаться на интерфейсе ISerializable - скажем только, что он служит более совершенным способом изменения того, какие данные сериализуются.

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

Следующий пример демонстрирует класс, помеченный атрибутом Serializable:

[Serializable] public class Person

public Person 0

public int Age { get; set; };

public int WeightlnPounds { get; set; };

Полный код этого примера доступен в подкаталоге Chapter30/05 Serialize. Для хранения экземпляра этого класса Person необходимо использовать объект Formatter - этот объект преобразует данные, хранящиеся внутри класса, в поток байтов. Система оснащена двумя форматировщиками, используемыми по умолчанию: BinaryFormatter и SoapFormatter (которые обладают собственными пространствами имен в пространстве имен System. Runtime . Serialization . Formatters). Использование BinaryFormatter для сохранения объекта person показано в следующем примере:



using System;

using System.Runtime.Serialization.Formatters.Binary; using System.10;

public static void Serialize

Конструирование объекта person. Person me = new Person () ;

Установка данных, которые должны быть сериализованы. те.Age =40;

me.WeightlnPounds = 200;

Создание дискового файла для хранения объекта... Stream s = File.Open ( Me.dat , FileMode.Create);

И применение BinaryFormatted для записи объекта в поток... BinaryFormatter bf = new BinaryFormatter ();

Сериализация объекта, bf.Serialize (s , me);

Закрытие потока, s.Close 0;

Вначале код создает объект person (персона) и устанавливает данные Age (возраст) и WeightinPounds (вес В фунтах), а затем формирует проток в файле Me. dat. Двоичный форматировщик использует поток для сохранения экземпляра класса person в файле Me. dat, после чего поток закрывается.

Используемый по умолчанию код сериализации сохраняет все общедоступное содержимое объекта, что требуется в большинстве случаев. Однако в ряде обстоятельств может требоваться определение одного или более полей, которые не должны подвергаться сериализации. Это также легко сделать - достаточно добавить атрибут [NonSerialized] к данным, которые нужно исключить из процесса сериализации. Этот атрибут применим только к полям, поэтому свойство Weight InPounds в приведенном примере изменено так, чтобы оно использовало вспомогательное поле:

[Serializable] public class Person {

public Person 0

public int Age { get; set; };

[NonSerialized]

private int weightInPounds;

public int WeightlnPounds {

get { return weightInPounds; set { weightInPounds = value;



1 ... 315 316 317 [ 318 ] 319 320 321 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика