Поделиться через


Практическое руководство. Восстановление часовых поясов из внедренного ресурса

В этом разделе описывается восстановление часовых поясов, которые были сохранены в файле ресурсов. Сведения и инструкции по сохранению часовых поясов см. в разделе Практическое руководство. Сохранение часовых поясов во внедренном ресурсе.

Для десериализации объекта TimeZoneInfo из внедренного ресурса

  1. Если извлекаемый часовой пояс не является пользовательским часовым поясом, попытайтесь создать его экземпляр с помощью метода FindSystemTimeZoneById.

  2. Создайте объект ResourceManager, передав полное имя файла внедренного ресурса и ссылку на сборку, содержащую файл ресурсов.

    Если вам не удается определить полное имя внедренного ресурсного файла, используйте Ildasm.exe (дизассемблер MSIL) для проверки манифеста сборки. Элемент .mresource идентифицирует ресурс. В примере полным ресурсным именем является SerializeTimeZoneData.SerializedTimeZones.

    Если файл ресурсов внедрен в ту же сборку, которая содержит код экземпляра часового пояса, то можно получить ссылку на него, вызвав метод static (Shared в Visual Basic) GetExecutingAssembly.

  3. При сбое вызова метода FindSystemTimeZoneById или, если необходимо создать пользовательский часовой пояс, можно извлечь строку, содержащую сериализованный часовой пояс, вызвав метод ResourceManager.GetString.

  4. Чтобы десериализовать данные часового пояса, вызовите метод FromSerializedString.

Пример

В следующем примере десериализуется объект TimeZoneInfo, хранящийся во внедренном файле ресурсов .NET XML.

Private Sub DeserializeTimeZones()
   Dim cst, palmer As TimeZoneInfo
   Dim timeZoneString As String
   Dim resMgr As ResourceManager = New ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly)

   ' Attempt to retrieve time zone from system
   Try
      cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
   Catch ex As TimeZoneNotFoundException
      ' Time zone not in system; retrieve from resource
      timeZoneString = resMgr.GetString("CentralStandardTime")
      If Not String.IsNullOrEmpty(timeZoneString) Then
         cst = TimeZoneInfo.FromSerializedString(timeZoneString)
      Else
         MsgBox("Unable to create Central Standard Time Zone. Application must exit.")
         Exit Sub
      End If
   End Try
   ' Retrieve custom time zone
   Try
      timeZoneString = resMgr.GetString("PalmerStandardTime")
      palmer = TimeZoneInfo.FromSerializedString(timeZoneString)
   Catch ex As Exception
      MsgBox(ex.GetType().Name & ": Unable to create Palmer Standard Time Zone. Application must exit.")
      Exit Sub
   End Try
End Sub
private void DeserializeTimeZones()
{
   TimeZoneInfo cst, palmer;
   string timeZoneString;
   ResourceManager resMgr = new ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly());

   // Attempt to retrieve time zone from system
   try
   {
      cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
   }
   catch (TimeZoneNotFoundException)
   {
      // Time zone not in system; retrieve from resource
      timeZoneString = resMgr.GetString("CentralStandardTime");
      if (! String.IsNullOrEmpty(timeZoneString))
      {
         cst = TimeZoneInfo.FromSerializedString(timeZoneString);
      }
      else
      {
         MessageBox.Show("Unable to create Central Standard Time Zone. Application must exit.", "Application Error");
         return;
      }
   }
   // Retrieve custom time zone
   try
   {
      timeZoneString = resMgr.GetString("PalmerStandardTime");
      palmer = TimeZoneInfo.FromSerializedString(timeZoneString);
   }
   catch (MissingManifestResourceException) 
   {
      MessageBox.Show("Unable to retrieve the Palmer Standard Time Zone from the resource file. Application must exit.");
      return;
   }
}

Этот код иллюстрирует обработку исключений, чтобы обеспечить присутствие объекта TimeZoneInfo, необходимого приложению. Сначала код пробует создать объект TimeZoneInfo, извлекая его из реестра с помощью метода FindSystemTimeZoneById. Если часовой пояс не может быть создан, то код извлекает его из внедренного ресурсного файла.

Так как данные для пользовательских часовых поясов (часовых поясов, созданных с помощью метода CreateCustomTimeZone) не хранятся в реестре, код не осуществляет вызов FindSystemTimeZoneById для создания часового пояса Антарктики. Вместо этого код сразу обращается к файлу внедренных ресурсов, чтобы получить строку, содержащую данные пользовательского часового пояса, прежде чем вызывать метод FromSerializedString.

Компиляция кода

Для этого примера требуется:

  • Чтобы ссылки на System.Windows.Forms.dll и System.Core.dll были добавлены в проект.

  • Чтобы был осуществлен импорт следующих пространств имен:

    Imports System.Globalization
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Globalization;
    using System.IO;
    using System.Reflection;
    using System.Resources;
    using System.Windows.Forms;
    

См. также

Задачи

Практическое руководство. Сохранение часовых поясов во внедренном ресурсе

Основные понятия

Общие сведения о часовых поясах

Другие ресурсы

Даты, время и часовые пояса