Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 220

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 214 215 216 217 218 219 < 220 > 221 222 223 224 225 226 .. 320 >> Следующая

[Саг 3. ref 2]. [Radio 2], [JamesBondCar 1, ref 3. 2]
Эта формула будет помещена при сернализащш в место постоянного хранения вместе со значениями всех переменных классов Саг, Radio и JamesBondCar. Поскольку объект Саг (номер 3) связан с объектом Radio (номер 2), а объект JamesBondCar (номер 1) - с объектами 2 и 3, при сериализации в поток объекта JamesBondCar в этом процессе должны обязательно принимать участие и объект Саг, и объект Radio. Пожалуй, самое замечательное, что можно сказать о создании объектных графов в процессе сериализации в .NET, — то, что их создание производится полностью автоматически и не требует никакого участия со стороны программиста.
Настройка объектов для сериализации
Чтобы можно было провести сериализацию объекта, каждый класс, который будет участвовать в сериализации, должен обладать атрибутом [Serializable]. Вот и все (и это правда). Если же мы решим, что какие-либо переменные данного класса должны быть исключены из сериализации, достаточно просто пометить их как [NonSerialized]. Обычно так помечаются те данные класса, которые «запоминать» не нужно (к примеру, те, которые на самом деле являются константами). Например, вот класс Radio, помеченный как доступный для сериализации, заисключени-
ем единственной переменной:
Настройка объектов для сериализации 547
// Класс Radio может Оыть сериапиэован [Serializable] public c:sss Radio {
U Однако нам нет необходимости сохранять это число [NonSeriallred]
private int object]dumber - 9:
public RadioO{}
public void wbooi state)
{
if(state - - true)
MessageBox.Show("Music is on..."):
else
MessageBox. Show( "Notunes...");
}
I
Атрибуты, относящиеся к сериализации, фиксируются в метаданных типов, в чем легко убедиться при помощи ILDasm.exe (рис. 1 1.20).
f O:\CbharpBook\Labs\Chapter 11 Cur I oHtcApp,Ыл
EK* Mo* tWp
,., OACShsrpBookiLaoslChapter 1 UCarToHieApplbirrtDebugl.Car f~ > MANIFEST h-Щ CaiToFileApp
tVSCar
т Щ СагАрр
EJamesBondCaf
в- _
..... public auto ansi ssrlallzabie ЬгГогвВеІвіпіІ
!.....V objecllDNumber private notserializednt32
.....• .dor: voldo
. • On : yold(bool)
*\_¦ • 1_._ . j
.assembl) CarToFileApp Г
т
Рис. 11.20. Атрибуты serialiaable и nonserialized
Чтобы полностью подготовить наши автомобильные классы к сериализапшш, которые предстоят нам в будущих разделах, дадим определения каждого из этих классов со всеми положенными атрибутами:
// Класс Саг будет доступен для сериализации
[Serializable]
public class Car
t
protected string pet Пате: protected int maxSpeed: protected Radio theRadio
new fiadioi):
public tarcst.nng PetName. int maxSpeed)
Ї
548 Глава 11 • Ввод, вывод и сериализация объектов
public void TurnQnRad1o{bool state) {
theRadlo.On(state);
II Класс JamesBondCar будет также доступен для сериалиэации!
[SerialIzable]
public class JamesScrtdCar :
і
protected bool IsFHgntWorthy; protected bool IsSeaworthy;
public
public JamesBondCar(string petName. 1nt maxSped. bool canFly. bool canSubmerge)
base(petName, maxSpeed)
this. isFlightWorthy - canFly; th1s.1sSeaWorthy - canSubmerge;
public void {
. ifCisFHghtWorthy)
MessageBox.Show("Такіng off!"):
else
MessageBox.Show("Falling off cliff!"):
public void SoUnderWstsrO {
if(isSeaWorthy)
MessageBox.ShowCDiving..."):
else
MessageBox.ShowC'Drowning!!!");
}
}
this. petName - PetName: this.maxSpeed = maxSpeed:
}
/I Пусть значения всех переменных будут автоматически установлены по умолчании public СагО {}
public string PetName {
get { return petName: } set { petName - value; }
)
public int MaxSpeed (
get { return maxSpeed; } set { maxSpeed - value; }
}
Настройка объектов для сериализации 549
Таблица 11.15. Наиболее важные типы пространства имен System. Runtime.Serializaton
Тип_Описание
Formatter Абстрактный базовый класс, который обеспечивает наиболее важные
возможности для объектов Formatter в процессе сериализации
ObjectlDGenerator Генерирует идентификаторы для объектов в объектном графе
UbjectManager Управляет объектами в процессе десериализации
SerializationBuilder Абстрактный базовый класс, обеспечивающий возможности по сериализации
объекта в поток
Serializationlnfo Используется объектами со специальным «поведением» во время сериализации.
Объект Serializationlnfo объединяет в себе все данные, необходимые для сериализации или десериализации объекта. Можно сказать, что этот класс — нечто вроде хранилища пар имя — значение, представляющих внутреннее
состояние объекта
Выбираем объект Formatter
После того как мы пометили класс как доступный для сериализации, наша следующая задача - выбрать формат, в котором будет сохранен объектный граф. Пространство имен System. Rjnt'ione.Serial іzation. Ferratters включает в себя еще два пространства имен— х.Binary и *.Soap, каждому из которых соответствует один из двух объектов Fomatter, которые можно использовать по умолчанию. Класс Bi natyFormatl эг сериализует объектный граф в компактном потоке двоичного формата, в то время как класс SoapFomatter представляет граф как сообщение протокола SOAP (Simple Object Access Protocol - простого протокола доступа к объектам) в формате XM L Класс определен в библиотеке поэтому единствен-
Предыдущая << 1 .. 214 215 216 217 218 219 < 220 > 221 222 223 224 225 226 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100