Como: restaurar fusos horários de um recurso inserido

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

Para desserializar um objeto TimeZoneInfo de um recurso inserido

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

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

    Se você não puder determinar o nome totalmente qualificado do arquivo de recurso inserido, use o Ildasm.exe (Il Disassembler) para examinar o manifesto do assembly. Uma entrada .mresource identifica o recurso. No exemplo, o nome totalmente qualificado do recurso é SerializeTimeZoneData.SerializedTimeZones.

    Se o arquivo de recurso estiver inserido 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 método GetExecutingAssemblystatic (Shared no Visual Basic).

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

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

Exemplo

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

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

Esse código ilustra o tratamento de exceções para garantir que um objeto TimeZoneInfo exigido pelo aplicativo esteja presente. Primeiro, ele tenta criar uma instância de um objeto TimeZoneInfo recuperando-o do Registro usando o método FindSystemTimeZoneById. Se o fuso horário não puder ser instanciado, o código o recuperará do arquivo de recurso inserido.

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

Compilando o código

Este exemplo requer:

  • Que uma referência a System.Windows.Forms.dll e System.Core.dll seja adicionada 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
    

Confira também