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
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.
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 esSerializeTimeZoneData.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.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.
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