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 usando il metodo FindSystemTimeZoneById.
Creare un'istanza di un oggetto ResourceManager passando il nome completo del file di risorse incorporato e un riferimento all'assembly che contiene il file di risorse.
Se non è possibile determinare il nome completo del file di risorse incorporato, usare Ildasm.exe (disassemblatore IL) 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 contenente il codice di creazione di istanze del fuso orario, è possibile recuperare un riferimento al file chiamando il metodo
static
(Shared
in Visual Basic) GetExecutingAssembly.Se la chiamata al metodo FindSystemTimeZoneById ha esito negativo o se deve essere creata un'istanza di un fuso orario personalizzato, recuperare una stringa contenente 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 XML .NET incorporato.
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
Questo codice illustra la gestione delle eccezioni per assicurarsi che sia presente un oggetto TimeZoneInfo richiesto dall'applicazione. Tenta prima di tutto di creare un'istanza di un oggetto TimeZoneInfo recuperandolo dal Registro di sistema usando il metodo FindSystemTimeZoneById. Se non è possibile creare un'istanza del fuso orario, il codice lo recupera dal file di risorse incorporato.
Poiché i dati per fusi orari personalizzati (fusi orari di cui viene creata un'istanza usando il metodo CreateCustomTimeZone) non vengono archiviati nel Registro di sistema, il codice non chiama FindSystemTimeZoneById per creare un'istanza del fuso orario per Palmer, Antartide. Al contrario, cerca immediatamente il file di risorse incorporato per recuperare una stringa che contiene i dati del fuso orario prima di chiamare il metodo FromSerializedString.
Compilazione del codice
L'esempio presenta i requisiti seguenti:
Che un riferimento a System.Windows.Forms.dll e System.Core.dll verrà aggiunto al progetto.
Che verranno importati gli spazi dei nomi seguenti:
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