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

 

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

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

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

554 Глава 11 - Ввод, вывод и сериализация объектов
// Конструктор со специальной сигнатурой необходим для процесса десериализации class SomeClass
private SomeClass (Serializationlnfo si. StrearaingContext ctx){..}
}
Обратите внимание, что область видимости этого конструктора определена как private. Это вполне допустимо, поскольку объект Formatter получает доступ к членам класса вне зависимости от того, какая область видимости для него установлена. Лучше, чтобы этот конструктор был определен именно как private - тогда ни у кого из случайных пользователей не возникнет идея создавать объекты таким несколько странным способом во время обычной работы (вне процесса десериализации).
Первый параметр, который принимает этот конструктор, — это объект класса Seri al і zati onInfo,B который мы можем поместить все пары имя — значение, представляющие состояние нашего объекта. В классе Serialization Inf о определен метод AddVdlue(), который многократно перегружен, чтобы обеспечить возможность работыспеременнымилюбоготипа(строковыми,целочисленными,логическими и т. п.). Кроме того, в Seriallzatlonlnfo определено множество методов GetXXXXO, которые можно использовать для извлечения информации о состоянии объекта при его воссоздании. Мы еще познакомимся с этими методами в действии.
Второй параметр, который принимает этот конструктор, - объект StreamingContext, который используется для хранения информации о месте хранения информации об объекте. Наиболее важный член этого объекта — свойство State, для которого используются значения из перечисления StreamingContextStates (табл. 11.17).
Таблица 11.17. Значения перечисления StreamingContextStates Значение Описание
All
Clone
CrossAppDomain CrossMachine
CrossProcess
File Other
Persistence
Remoting
Указывает, что сериализованные данные могут быть переданы в любое место или получены из любого места
Указывает, что объект будет клонирован
Указывает, что местом назначения или источником будет другой AppDornaln
Указывает, что место назначения или источник будут расположены на другом компьютере
Указывает, что местом назначения или источником будет другой процесс на том же самом компьютере
Указывает, что местом назначения или источником будет файл
Указывает, что место назначения или источник не определены
Указывает, что место назначения или источник — постоянное хранилище. Им может, к примеру, служить база данных или файл. Обычно данные в таких хранилищах хранятся гораздо дольше времени жизни программного процесса, поэтому не следует помещать в постоянное хранилище объекты, для десериализации которых необходима ссылка на какие-то другие объекты текущего процесса (без информации об этих объектах)
Указывает, что место назначения или источник неизвестны (например, .удаленный компьютер или локальный компьютер)_
Простой пример пользовательской сериализации
Еще раз повторим, что в подавляющем большинстве случаев стандартная сериализация, которая производится средствами встроенных в .NETобъектов Formatter,
Сериализация в пользовательском формате и интерфейс 555
вполне приемлема. Однако для того, чтобы проиллюстрировать то, что было сказано выше, мы создадим новый вариант класса Саг, который будет определен таким ¦образом, чтобы к нему можно было применять пользовательскую сериализапи ю. Ничего особенно сложного при реализации GetObjectState() или специального варианта конструктора не потребуется. Достаточно, чтобы эти методы правильно взаимодействовали с внутренними переменными нашего объекта и сохраняли эту информацию в объекте Serializationlnfo (или считывали ее из него). Выглядеть определение нашего класса может следующим образом:
public class CustomiCailype : !Serial іzabIe
public string petName; public int maxSpeed.:
public CustomCarType!string s, int i) { petName s: maxSpeed - i: }
// Передаем информацию о состоянии объекта объекту Formatter
public void GetObjectDatatSerializationlnfo si. StreamingContext ctx)
(
I/ Каков тип нашего потока?
Console.WriteU net TGetObjectData] Context State: {0}".
ctx.State.FormatO):
si.AddValueCCapPetName". petName); si.AddValue("MaxSpeed". maxSpeed);
\ j
Il А теперь позаботимся о специальной варианте конструктора private CustomCarType(SerializationInfo si. Streami ngContext ctx)
Il Какое тип нашего потока?
Console.WriteUneCCctor] Context State: {Q}". ctx.State.FormatO);
petName - si .GetString<"CapPetName"): maxSpeed = si .Getlrrt32( "maxSpeed"):
Теперь мы можем произвести процессы сериализации и десериализации для нашего специального класса (результат показан нарис. 11.24):
public static int MainCstringL] args)
і
CustomCarType myAuto - new CustomCarTypeC'Siddhartha". 50): Stream myStream - File.CreaterCarData.dat"):
И Задействуем интерфейс !Serialіzable BinaryFormatter myBinary Format - new BinaryFormatterC); myBinaryFormat.SerializeCmyStream. myAuto): myStream. Closet):
myStream * File. Open Read ("CarData.dat"): Il Вызываем спецконструктор
CustomCarType carFromDisk = (CustomCarType)myBinaryFormat.Deserialize(myStream);
Предыдущая << 1 .. 217 218 219 220 221 222 < 223 > 224 225 226 227 228 229 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100