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

 

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

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

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

68 65 52 61 64 69 6F 02 00 d. Car+theRadio,.
00 00 04 46 72 65 64 32 00 ..........Fred2.
09 00 00 00 32 00 00 00 ............2. . .
00 00 00 12 43 61 72 54 6F ...........CarTo
2E 52 61 64 69 6F 00 00 00 FileApp.Radio...
Рис. 1122. Объект JamesBondCar в двоичном формате
Предположим, что нам потребовалось произвести обратную операцию — основании сохраненной информации восстановить объект JamesBondCar. Для этого,
552 Глава 11 • Ввод, вывод и сериализация объектов
как мы уже говорили, необходимо использовать метод Bl naryWrtter. Deserial 1 zableu. Однако обратите внимание, что этот метод возвращает объект класса System. Object, и чтобы им можно было нормально пользоваться, мы должны явно привести этот объект к типу JamesBondCar:
// Считываем информацию об объекте из двоичного файла myStream = FileOpenReadeCCarData.dat");
JamesBondCar сагїтаСіізк - (JamesBondCar>я.уВіrwryFormat.Oeser*alIzetnyStreaw):
Console.WriteLineCcarFronCisk.PetName + " is alive!"): carFrcmDisk.TurnOnRadio(true); myStream.CloseO:
Обратите внимание, что при вызове метода Deseri al ~'ze() мы должны передать ему объект класса, производного от Stream (в данном случае тот же самый поток из двоичного файла на диске). Таким образом, сериализация и десериализация в двоичном формате в .N IfT производится исключительно просто — только не забывайте помечать классы атрибутом [serializable].
Сериализация в формате SOAP
Мы можем сериализовать объекты не только в двоичном формате, но и в формате SOAP. Для этого используется объект SoapFormatter. Как уже говорилось, прежде чем использовать этот объект, мы должны указать в нашем приложении ссылку на сборку Syste.Runtime.Serialization.Formatters.Soap.dLt. Ниже приведен пример, в котором тот же самый объект JamesBondCar сериализуется в файл в XML-совместимом формате сообщений SOAP (если вам этот формат совершенно не знаком, пока не берите в голову — подробнее о SOAP мы будем говорить в главе 15). Код нового варианта нашего примера может выглядеть следующим образом:
using System.Runtime.Serial і zati on. Formatters, Soap:
Il Сохраняем тот же самый объект в формате SOAP FileStream myStream - File.CreateC'CarData.xmr): SoapFormatter myXMLFormat - new SoapFormatterO: myXMLFormat.Seri alіzeCmyStream. myAuto): myStream. Cl oseO:
Il Восстанавливаем объект из файла SOAP myStream - File.OpenReadС"CarData.xml");
JamesBondCar carFromXML - (JamesBondCar)myXMLForrnat.Deser1al1ze(myStreara):
Console.WriteL1ne(carFromXMLPetName + " is alive!"): myStream. Cl oseO:
Как можно убедиться, работа с SoapFormatter практически идентична работе с BinaryFormatter. Точно так же вызываются методы SerializeO и Deserializer) для сохранения объекта в месте хранения и его восстановления на основе сохраненной информации. Если мы откроем созданный нами файл CarData.xml, то сможем убедиться, что вся информация об объекте (включая информацию о его взаимосвязях с другими объектами) записана в тегах XML (рис. 11.23).
Код приложения можно найти в подкаталоге Chapter
Сериализация в пользовательском формате и интерфейс ISerializabie §53
i>iJi'l)t<bii>l і. ігі>.!і,і_к ml
Il
і
4
щ І і. з
9
IU
IU 12 Щ
и
<SQAP-ENV; Envelope xmlns :xsl="htTLp: 11 <SOAP-ENV:Body> <al: JamesBondCar ld="ref-l"> <isrlightBoithy>iaiae</iBFli0htVoEthy> <lsSeaS!orthy>true</isSealfucUiS>:> <pecNanie i
<maxSpeed>50</maxSpeed> <theF,adia href *"#ref-<r7> <Car Qx2b petName href»"#ref-3'7> <Car Ox2b_Hiax5peed>5O</Car_0x2b_maxSpeed> <Can_Qx2b_theF,adio hre<""#Гві-4*У > </al: JamesBondCaO <al:Radio id="ref-4"> </al:Radio> </ SOiP-EHV і Bouy> </SOAP-EWV:Envelope>
Ei Ш. 0 Dato
Рис. 11.23. Объект JamesBcndCaг сохранен в формате SOAP
Сериализация в пользовательском формате и интерфейс ISerializabie
Как мы уже говорили, в принципе, не обязательно оери<ілнзовать объекты теми двумя способами, которые предусмотрены в виде объектов rinaryformatter и ScapFor matter (хотя их возможностей в большинстве случаев вполне достаточно). Мы можем позаботиться о том, чтобы какой-то класс сериализовалсяспециальным, предусмотренным только для него способом, определив в нем несколько специальных членов. Классы, которые определены в пространстве имен System.кьхііие.Зегіа 1 ization, помогут нам в этом.
Первое, что мы должны сделать, — обеспечить реализацию в нашем классе интер фейса ISeri al izable. Определение этого интерфейса выглядит следующим образом:
// Для специальной сериализации какого-либо класса этот класс должен реализовать // интерфейс ISerializabie public interface ISerializabie
{
public virtual void GetObjectDatatSerializationlnfo info, StreamingContext
context);
}
Этот интерфейс определяет единственный метод GelGbjectQataO, который вьмы-вается объектом Formatter в процессе сериализации. Реализация этого методадолжна помещать в принимаемый в качестве параметра объект Serial izationlnfo все необходимые наборы имя — значение. Можно сказать, что - : — это «мешок со свойствами» (property bag) - вещь хорошо знакомая программистам СОМ.
Объекты, для которых обеспечивается специальная сериализация, должны не только реализовать интерфейс ISeri si izable, но еще и обязательно определять конструктор со специальной сигнатурой:
Предыдущая << 1 .. 216 217 218 219 220 221 < 222 > 223 224 225 226 227 228 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100