Compartir a través de


Cómo: Restaurar zonas horarias de un recurso incrustado

En este tema se describe cómo restaurar las zonas horarias guardadas en un archivo de recursos. Para obtener información e instrucciones sobre cómo guardar zonas horarias, vea Cómo: Guardar zonas horarias en un recurso incrustado.

Para deserializar un objeto TimeZoneInfo a partir de un recurso incrustado

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

  2. Cree instancias 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, utilice Ildasm.exe (Desensamblador de MSIL) 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 la 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 hay que crear instancias de una zona horaria personalizada, recupere una cadena que contenga la zona horaria serializada llamando al método ResourceManager.GetString.

  4. Deserialice los datos de la 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 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;
   }
}

Este código muestra el control de excepciones para garantizar que un objeto TimeZoneInfo requerido por la aplicación está presente. En primer lugar, intenta crear instancias de un objeto TimeZoneInfo recuperándolo 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.

Debido a que los datos de las zonas horarias personalizadas (zonas horarias de las que se crearon instancias utilizando el método CreateCustomTimeZone) no se almacenan en el Registro, el código no llama al método FindSystemTimeZoneById para crear las instancias de la zona horaria de Base Palmer, en la Antártida. En su lugar, busca inmediatamente en el archivo de recursos incrustado para recuperar una cadena que contenga los datos de la zona horaria antes de llamar al método FromSerializedString.

Compilar el código

Para este ejemplo se necesita:

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

  • Que se importen los siguientes espacios de nombres:

    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;
    

Vea también

Tareas

Cómo: Guardar zonas horarias en un recurso incrustado

Conceptos

Información general sobre zonas horarias

Otros recursos

Fechas, horas y zonas horarias