Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 411

Эндрю Троелсен

Проблема в том, что оригинальный объект UserPrefs, сохраненный в C:\user.dat, не сохранял два новых поля, присутствующих в обновленном определении класса (это поля BeepFreq и ConsoleTitle). Очевидно, что это настоящая проблема, поскольку для сохраняемого объекта вполне естественно эволюционировать в процессе существования.

[Seriаlizable]

class UserPrefs {

 public ConsoleColor BackgroundColor;

 public ConsoleColor ForegroundColor;

 // Являются новыми!

 [OptionalField]

 public int BeepFreq;

 [OptionalField]

 public string ConsoleTitle;

 public UserPrefs() {

  BeepFreq = 1000;

  ConsoleTitle = ''Моя консоль";

  BackgroundColor = ConsoleColor.Black;

  ForegroundColor = ConsoleColor.Red;

}

Когда форматтер реконструирует объект и обнаруживает, что отсутствующие поля помечены, как необязательные, исключение среды выполнения уже не генерируется. Вместо этого данные, которые были сохранены, проецируется обратно в существующие поля (в данном случае это BackgroundColor и ForegroundColor), a остальным полям присваиваются значения, предусмотренные по умолчанию.

Замечание. Следует понимать, что использование [OptionalField] не решает проблему версий сохраненных объектов полностью. Однако этот атрибут обеспечивает решение самой типичной проблемы (добавление новых полей данных). Для решения более сложных задан поддержки версий все же потребуется реализация интерфейса ISerializable.

Исходный код. Проект VersionedObject размещен в подкаталоге, соответствующем главе 17.

Резюме

В этой главе предлагается обсуждение сервисов сериализации. Вы могли убедиться в том. что платформа .NET для корректного учета всего множества связанных объектов, подлежащих сохранению в потоке, использует объектные графы. Когда каждый член объектного графа обозначен атрибутом [Seriаlizable], данные можно сохранять в любом из нескольких доступных форматов (в двоичном формате, формате SOAP или формате XML).

Вы также узнали о том, что процесс сериализации допускает пользовательскую настройку в рамках двух возможных подходов. Во-первых, у вас есть возможность реализовать интерфейс ISerializable (с поддержкой специального приватного конструктора), чтобы влиять на то. как средства форматирования сохраняют поступающие данные. Во-вторых, вы можете использовать множество новых атрибутов, появившихся в .NET 2.0, которые упрощают процесс сериализации с пользовательскими настройками. Следует просто применить один из атрибутов [OnSerializing], [OnSerialized], [OnDeserializing] или [OnDeserialized] к членам, получающим параметр StreamingContext, и форматтер обработает их соответствующим образом. Завершается глава обсуждением еще одного атрибута, [OptionalField], который может использоваться для поддержки версий сериализации типов.

ГЛАВА 18. Удаленное взаимодействие .NET

Разработчики, не имеющие опыта работы с платформой .NET, обычно относят .NET только к средствам создания Интернет-приложений (поскольку ".NET"' часто ассоциируется с "Интернет" и соответствующим программным обеспечением. Вы уже имели возможность убедиться в том, что это далеко не так. Создание Web-приложений является лишь одной и очень узкой (но широко разрекламированной) возможностью платформы .NET. В русле этой информации многие разработчики .NET, не имеющие достаточного опыта, склонны предполагать, что Web-сервисы XML обеспечивают единственный способ взаимодействия с удаленными объектами. Это тоже не соответствует действительности. Используя слой удаленного взаимодействия .NET, можно строить одноранговые распределенные приложения, не имеющие ничего общего с HTTР или XML (если вы этого захотите).