Partilhar via


Como: Restaurar fusos horários a partir de um recurso incorporado

Este tópico descreve como restaurar fusos horários que foram salvos em um arquivo de recurso. Para obter informações e instruções sobre como salvar fusos horários, consulte Como salvar fusos horários em um recurso incorporado.

Para desserializar um objeto TimeZoneInfo de um recurso incorporado

  1. Se o fuso horário a ser recuperado não for um fuso horário personalizado, tente instanciá-lo usando o FindSystemTimeZoneById método.

  2. Instancie um ResourceManager objeto passando o nome totalmente qualificado do arquivo de recurso incorporado e uma referência ao assembly que contém o arquivo de recurso.

    Se não for possível determinar o nome totalmente qualificado do arquivo de recurso incorporado, use o Ildasm.exe (IL Disassembler) para examinar o manifesto do assembly. Uma .mresource entrada identifica o recurso. No exemplo, o nome totalmente qualificado do recurso é SerializeTimeZoneData.SerializedTimeZones.

    Se o arquivo de recurso estiver incorporado no mesmo assembly que contém o código de instanciação de fuso horário, você poderá recuperar uma referência a ele chamando o static método (Shared no Visual Basic GetExecutingAssembly ).

  3. Se a chamada para o método falhar ou se um fuso FindSystemTimeZoneById horário personalizado for instanciado, recupere uma cadeia de caracteres que contenha o fuso horário serializado chamando o ResourceManager.GetString método.

  4. Desserialize os dados de fuso horário chamando o FromSerializedString método.

Exemplo

O exemplo a seguir desserializa um TimeZoneInfo objeto armazenado em um arquivo de recurso XML .NET incorporado.

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

Este código ilustra o tratamento de exceções para garantir que um TimeZoneInfo objeto exigido pelo aplicativo esteja presente. Ele primeiro tenta instanciar um TimeZoneInfo objeto recuperando-o do registro usando o FindSystemTimeZoneById método. Se o fuso horário não puder ser instanciado, o código o recuperará do arquivo de recurso incorporado.

Como os dados para fusos horários personalizados (fusos horários instanciados usando o CreateCustomTimeZone método) não são armazenados no registro, o código não chama o FindSystemTimeZoneById para instanciar o fuso horário para Palmer, Antarctica. Em vez disso, ele procura imediatamente o arquivo de recurso incorporado para recuperar uma cadeia de caracteres que contém os dados do fuso horário antes de chamar o FromSerializedString método.

Compilação do código

Este exemplo requer:

  • Que uma referência a System.Windows.Forms.dll e System.Core.dll ser acrescentada ao projeto.

  • Que os seguintes namespaces sejam importados:

    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
    

Consulte também