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

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

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

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

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

    Если вы не можете определить полное имя внедренного файла ресурсов, используйте Ildasm.exe (IL Disassembler) для изучения манифеста сборки. .mresource Запись определяет ресурс. В этом примере полное имя ресурса — SerializeTimeZoneData.SerializedTimeZonesэто .

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

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

  4. Десериализация данных часового пояса FromSerializedString путем вызова метода.

Пример

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

private void DeserializeTimeZones()
{
   TimeZoneInfo cst, palmer;
   string timeZoneString;
   ResourceManager resMgr = new ResourceManager("SerializeTimeZoneData.SerializedTimeZones", this.GetType().Assembly);

   // 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;
   }
}
Private Sub DeserializeTimeZones()
    Dim cst, palmer As TimeZoneInfo
    Dim timeZoneString As String
    Dim resMgr As ResourceManager = New ResourceManager("SerializeTimeZoneData.SerializedTimeZones",
                                    GetType(SerializeTimeZoneData).Assembly)

    ' 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

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

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

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

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

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

  • Импортируются следующие пространства имен:

    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;
    
    Imports System.Globalization
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    

См. также