Instrukcje: Przywracanie stref czasowych z zasobu osadzonego

W tym temacie opisano sposób przywracania stref czasowych zapisanych w pliku zasobów. Aby uzyskać informacje i instrukcje dotyczące oszczędzania stref czasowych, zobacz Instrukcje: zapisywanie stref czasowych w zasobie osadzonym.

Aby wykonać deserializowanie obiektu TimeZoneInfo z zasobu osadzonego

  1. Jeśli strefa czasowa do pobrania nie jest niestandardową strefą czasową, spróbuj utworzyć jej wystąpienie przy użyciu FindSystemTimeZoneById metody .

  2. ResourceManager Utwórz wystąpienie obiektu, przekazując w pełni kwalifikowaną nazwę pliku zasobu osadzonego i odwołanie do zestawu zawierającego plik zasobu.

    Jeśli nie możesz określić w pełni kwalifikowanej nazwy osadzonego pliku zasobu, użyj Ildasm.exe (dezasembler IL), aby zbadać manifest zestawu. Wpis .mresource identyfikuje zasób. W tym przykładzie w pełni kwalifikowana nazwa zasobu to SerializeTimeZoneData.SerializedTimeZones.

    Jeśli plik zasobu jest osadzony w tym samym zestawie, który zawiera kod tworzenia wystąpienia strefy czasowej, możesz pobrać odwołanie do niego, wywołując static metodę (Shared w Visual Basic). GetExecutingAssembly

  3. Jeśli wywołanie FindSystemTimeZoneById metody nie powiedzie się lub jeśli niestandardowa strefa czasowa ma zostać utworzone, pobierz ciąg zawierający serializowaną strefę czasową, wywołując metodę ResourceManager.GetString .

  4. Deserializuj dane strefy czasowej, wywołując metodę FromSerializedString .

Przykład

Poniższy przykład deserializuje TimeZoneInfo obiekt przechowywany w osadzonym pliku zasobów XML platformy .NET.

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

Ten kod ilustruje obsługę wyjątków, aby upewnić się, że obiekt wymagany przez aplikację TimeZoneInfo jest obecny. Najpierw próbuje utworzyć wystąpienie TimeZoneInfo obiektu, pobierając go z rejestru przy użyciu FindSystemTimeZoneById metody . Jeśli nie można utworzyć wystąpienia strefy czasowej, kod pobiera go z osadzonego pliku zasobu.

Ponieważ dane niestandardowych stref czasowych (stref czasowych utworzone przy użyciu CreateCustomTimeZone metody) nie są przechowywane w rejestrze, kod nie wywołuje FindSystemTimeZoneById wystąpienia strefy czasowej dla Palmer, Antarktydy. Zamiast tego natychmiast analizuje osadzony plik zasobów, aby pobrać ciąg zawierający dane strefy czasowej przed wywołania FromSerializedString metody .

Kompilowanie kodu

Ten przykład wymaga:

  • To odwołanie do System.Windows.Forms.dll i System.Core.dll należy dodać do projektu.

  • Aby zaimportować następujące przestrzenie nazw:

    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
    

Zobacz też