Procedura: ripristinare i fusi orari da una risorsa incorporata
In questo argomento viene descritto come ripristinare i fusi orari salvati in un file di risorse. Per informazioni e istruzioni sul salvataggio dei fusi orari, vedere Procedura: salvare fusi orari in una risorsa incorporata.
Per deserializzare un oggetto TimeZoneInfo da una risorsa incorporata
Se il fuso orario da recuperare non è un fuso orario personalizzato, provare a crearne un'istanza utilizzando il metodo FindSystemTimeZoneById.
Creare un'istanza di un oggetto ResourceManager passando il nome completo del file di risorse incorporate e un riferimento all'assembly che contiene il file di risorse.
Se non è possibile determinare il nome completo del file di risorse incorporate, utilizzare Ildasm.exe (disassemblatore MSIL) per esaminare il manifesto dell'assembly. Una voce .mresource identifica la risorsa. Nell'esempio il nome completo della risorsa è SerializeTimeZoneData.SerializedTimeZones.
Se il file di risorse è incorporato nello stesso assembly che contiene il codice per la creazione di istanze del fuso orario, è possibile recuperarne un riferimento chiamando il metodo static (Shared in Visual Basic) GetExecutingAssembly.
Se la chiamata al metodo FindSystemTimeZoneById non riesce o se è necessario creare un'istanza di un fuso orario personalizzato, recuperare una stringa che contenga il fuso orario serializzato chiamando il metodo ResourceManager.GetString.
Deserializzare i dati del fuso orario chiamando il metodo FromSerializedString.
Esempio
Nell'esempio seguente viene deserializzato un oggetto TimeZoneInfo archiviato in un file di risorse .NET XML incorporate.
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;
}
}
In questo codice viene illustrata la gestione delle eccezioni per assicurarsi che sia presente un oggetto TimeZoneInfo richiesto dall'applicazione. Viene innanzitutto tentata la creazione di un'istanza di un oggetto TimeZoneInfo recuperandolo dal Registro di sistema mediante il metodo FindSystemTimeZoneById. Se non è possibile creare un'stanza del fuso orario, il codice lo recupera dal file di risorse incorporate.
Poiché i dati per i fusi orari personalizzati (fusi orari di cui è stata creata un'istanza utilizzando il metodo CreateCustomTimeZone) non vengono archiviati nel Registro di sistema, il codice non chiama il metodo FindSystemTimeZoneById per creare un'istanza del fuso orario per la stazione Palmer Station, Antartide. Cerca invece immediatamente il file di risorse incorporate per recuperare una stringa che contenga i dati del fuso orario prima che venga chiamato il metodo FromSerializedString.
Compilazione del codice
Per questo esempio è necessario:
Aggiungere un riferimento a System.Windows.Forms.dll e System.Core.dll al progetto.
Importare gli spazi dei nomi seguenti:
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;
Vedere anche
Attività
Procedura: salvare fusi orari in una risorsa incorporata