Dela via


Anvisningar: Återställa tidszoner från en inbäddad resurs

I det här avsnittet beskrivs hur du återställer tidszoner som har sparats i en resursfil. Information och instruktioner om hur du sparar tidszoner finns i Så här sparar du tidszoner till en inbäddad resurs.

Så här deserialiserar du ett TimeZoneInfo-objekt från en inbäddad resurs

  1. Om tidszonen som ska hämtas inte är en anpassad tidszon kan du prova att instansiera den med hjälp FindSystemTimeZoneById av metoden .

  2. Instansiera ett ResourceManager objekt genom att skicka det fullständigt kvalificerade namnet på den inbäddade resursfilen och en referens till sammansättningen som innehåller resursfilen.

    Om du inte kan fastställa det fullständigt kvalificerade namnet på den inbäddade resursfilen använder du Ildasm.exe (IL Disassembler) för att undersöka sammansättningens manifest. En .mresource post identifierar resursen. I exemplet är SerializeTimeZoneData.SerializedTimeZonesresursens fullständigt kvalificerade namn .

    Om resursfilen är inbäddad i samma sammansättning som innehåller tidszonens instansieringskod kan du hämta en referens till den genom att anropa static metoden (Shared i Visual Basic). GetExecutingAssembly

  3. Om anropet FindSystemTimeZoneById till metoden misslyckas, eller om en anpassad tidszon ska instansieras, hämtar du en sträng som innehåller den serialiserade tidszonen ResourceManager.GetString genom att anropa metoden.

  4. Deserialisera tidszonsdata genom att anropa FromSerializedString metoden.

Exempel

I följande exempel deserialiseras ett TimeZoneInfo objekt som lagras i en inbäddad .NET XML-resursfil.

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

Den här koden illustrerar undantagshantering för att säkerställa att ett TimeZoneInfo objekt som krävs av programmet finns. Det försöker först att instansiera ett TimeZoneInfo objekt genom att hämta det från registret med hjälp av FindSystemTimeZoneById -metoden. Om tidszonen inte kan instansieras hämtar koden den från den inbäddade resursfilen.

Eftersom data för anpassade tidszoner (tidszoner som instansieras med hjälp CreateCustomTimeZone av metoden) inte lagras i registret anropar FindSystemTimeZoneById koden inte för att instansiera tidszonen för Palmer, Antarktis. I stället ser den direkt till den inbäddade resursfilen för att hämta en sträng som innehåller tidszonens data innan den FromSerializedString anropar metoden.

Kompilera koden

Det här exemplet kräver:

  • Att en referens till System.Windows.Forms.dll och System.Core.dll läggas till i projektet.

  • Att följande namnområden importeras:

    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
    

Se även