Vorgehensweise: Wiederherstellen von Zeitzonen aus einer eingebetteten Ressource

In diesem Thema wird beschrieben, wie Zeitzonen wiederhergestellt werden, die in einer Ressourcendatei gespeichert wurden. Informationen und Anweisungen zum Speichern von Zeitzonen finden Sie unter Gewusst wie: Speichern von Zeitzonen in einer eingebetteten Ressource.

So deserialisieren Sie ein TimeZoneInfo-Objekt aus einer eingebetteten Ressource

  1. Wenn die abzurufende Zeitzone keine benutzerdefinierte Zeitzone ist, instanziieren Sie sie mithilfe der FindSystemTimeZoneById-Methode.

  2. Instanziieren Sie ein ResourceManager-Objekt, indem Sie den vollqualifizierten Namen der eingebetteten Ressourcendatei und einen Verweis auf die Assembly übergeben, die die Ressourcendatei enthält.

    Wenn Sie den vollqualifizierten Namen der eingebetteten Ressourcendatei nicht ermitteln können, verwenden Sie den IL-Disassembler (Ildasm.exe), um das Manifest der Assembly zu untersuchen. Ein .mresource-Eintrag identifiziert die Ressource. Im Beispiel lautet der vollqualifizierte Name der Ressource SerializeTimeZoneData.SerializedTimeZones.

    Wenn die Ressourcendatei in dieselbe Assembly eingebettet ist, die den Zeitzonen-Instanziierungscode enthält, können Sie einen Verweis darauf abrufen, indem Sie die static-Methode (Shared in Visual Basic) namens GetExecutingAssembly aufrufen.

  3. Wenn der Aufruf der FindSystemTimeZoneById-Methode fehlschlägt oder eine benutzerdefinierte Zeitzone instanziiert werden soll, rufen Sie eine Zeichenfolge ab, die die serialisierte Zeitzone enthält, indem Sie die ResourceManager.GetString-Methode aufrufen.

  4. Deserialisieren Sie die Zeitzonendaten, indem Sie die FromSerializedString-Methode aufrufen.

Beispiel

Im folgenden Beispiel wird ein TimeZoneInfo-Objekt deserialisiert, das in einer eingebetteten .NET-XML-Ressourcendatei gespeichert ist.

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

Dieser Code veranschaulicht die Ausnahmebehandlung, um sicherzustellen, dass ein für die Anwendung erforderliches TimeZoneInfo-Objekt vorhanden ist. Zunächst wird versucht, ein TimeZoneInfo-Objekt zu instanziieren, indem es mithilfe der FindSystemTimeZoneById-Methode aus der Registrierung abgerufen wird. Wenn die Zeitzone nicht instanziiert werden kann, ruft der Code sie aus der eingebetteten Ressourcendatei ab.

Da Daten für benutzerdefinierte Zeitzonen (mit der CreateCustomTimeZone-Methode instanziierte Zeitzonen) nicht in der Registrierung gespeichert werden, ruft der Code nicht FindSystemTimeZoneById auf, um die Zeitzone für Palmer, Antarctica, zu instanziieren. Stattdessen wird sofort nach der eingebetteten Ressourcendatei gesucht, um eine Zeichenfolge mit den Daten der Zeitzone abzurufen, bevor die FromSerializedString-Methode aufgerufen wird.

Kompilieren des Codes

Für dieses Beispiel benötigen Sie Folgendes:

  • Dass dem Projekt ein Verweis auf „System.Windows.Forms.dll“ und „System.Core.dll“ hinzugefügt wird.

  • Dass die folgenden Namespaces importiert werden:

    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
    

Weitere Informationen