Procedimiento para restaurar zonas horarias de un recurso incrustado

En este tema se describe cómo restaurar zonas horarias guardadas en un archivo de recursos. Para obtener información e instrucciones sobre cómo ahorrar zonas horarias, consulte Procedimiento para guardar zonas horarias en un recurso incrustado.

Para deserializar un objeto TimeZoneInfo desde un recurso incrustado

  1. Si la zona horaria que se va a recuperar no es una zona horaria personalizada, intente crear una instancia de ella mediante el método FindSystemTimeZoneById.

  2. Cree una instancia de un objeto ResourceManager pasando el nombre completo del archivo de recursos incrustado y una referencia al ensamblado que contiene el archivo de recursos.

    Si no puede determinar el nombre completo del archivo de recursos incrustado, use el Ildasm.exe (Desensamblador de IL) para examinar el manifiesto del ensamblado. Una entrada .mresource identifica el recurso. En el ejemplo, el nombre completo del recurso es SerializeTimeZoneData.SerializedTimeZones.

    Si el archivo de recursos está incrustado en el mismo ensamblado que contiene el código de creación de instancias de zona horaria, puede recuperar una referencia a él llamando al método static (Shared en Visual Basic)GetExecutingAssembly.

  3. Si se produce un error en la llamada al método FindSystemTimeZoneById o si se va a crear una instancia de una zona horaria personalizada, recupere una cadena que contenga la zona horaria serializada llamando al método ResourceManager.GetString.

  4. Deserializa los datos de zona horaria llamando al método FromSerializedString.

Ejemplo

En el ejemplo siguiente se deserializa un objeto TimeZoneInfo almacenado en un archivo de recursos XML de .NET incrustado.

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 muestra el control de excepciones para asegurarse de que existe un objeto TimeZoneInfo requerido por la aplicación. Primero intenta crear una instancia de un objeto TimeZoneInfo recuperandolo del registro mediante el método FindSystemTimeZoneById. Si no se puede crear una instancia de la zona horaria, el código lo recupera del archivo de recursos incrustado.

Dado que los datos de zonas horarias personalizadas (zonas horarias que se crean instancias mediante el método CreateCustomTimeZone) no se almacenan en el registro, el código no llama a FindSystemTimeZoneById para crear una instancia de la zona horaria de Palmer, Antártida. En su lugar, busca inmediatamente el archivo de recursos incrustado para recuperar una cadena que contiene los datos de la zona horaria antes de llamar al método FromSerializedString.

Compilación del código

Para este ejemplo se necesita:

  • Que se agregue una referencia a System.Windows.Forms.dll y System.Core.dll al proyecto.

  • Que se importen los siguientes espacios de nombres:

    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 también