Sdílet prostřednictvím


Postupy: Obnovení časových pásem z integrovaného prostředku

Toto téma popisuje, jak obnovit časová pásma uložená v souboru prostředků. Informace a pokyny k úspoře časových pásem najdete v tématu Postupy: Úspora časových pásem do vloženého prostředku.

Deserializace objektu TimeZoneInfo z vloženého prostředku

  1. Pokud časové pásmo, které se má načíst, není vlastní časové pásmo, zkuste vytvořit instanci pomocí FindSystemTimeZoneById metody.

  2. ResourceManager Vytvořte instanci objektu předáním plně kvalifikovaného názvu vloženého souboru prostředků a odkazu na sestavení, které obsahuje soubor prostředků.

    Pokud nemůžete určit plně kvalifikovaný název vloženého souboru prostředků, pomocí Ildasm.exe (IL Disassembler) zkontrolujte manifest sestavení. Položka .mresource identifikuje prostředek. V příkladu je plně kvalifikovaný název SerializeTimeZoneData.SerializedTimeZonesprostředku .

    Pokud je soubor prostředků vložen do stejného sestavení, které obsahuje kód instance časového pásma, můžete na něj načíst odkaz voláním static metody (Shared v jazyce Visual Basic). GetExecutingAssembly

  3. Pokud volání FindSystemTimeZoneById metody selže nebo pokud se vytvoří instance vlastního časového pásma, načtěte řetězec, který obsahuje serializované časové pásmo voláním ResourceManager.GetString metody.

  4. Deserializovat data časového pásma voláním FromSerializedString metody.

Příklad

Následující příklad deserializuje TimeZoneInfo objekt uložený ve vloženém souboru prostředků .NET XML.

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

Tento kód znázorňuje zpracování výjimek, aby se zajistilo, že TimeZoneInfo existuje objekt vyžadovaný aplikací. Nejprve se pokusí vytvořit instanci TimeZoneInfo objektu načtením z registru pomocí FindSystemTimeZoneById metody. Pokud nelze vytvořit instanci časového pásma, kód ho načte ze souboru vloženého prostředku.

Vzhledem k tomu, že data pro vlastní časová pásma (vytvoření instance časových pásem pomocí CreateCustomTimeZone metody) nejsou uložená v registru, kód nevyvolá FindSystemTimeZoneById vytvoření instance časového pásma pro Palmer, Antarktidu. Místo toho okamžitě hledá vložený soubor prostředků k načtení řetězce, který obsahuje data časového pásma před voláním FromSerializedString metody.

Zkompilování kódu

Tento příklad vyžaduje:

  • Odkaz na System.Windows.Forms.dll a System.Core.dll se do projektu přidá.

  • Importují se následující obory názvů:

    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
    

Viz také