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

  1. Se il fuso orario da recuperare non è un fuso orario personalizzato, provare a crearne un'istanza usando il metodo FindSystemTimeZoneById.

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

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

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

Vedi anche