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
Om tidszonen som ska hämtas inte är en anpassad tidszon kan du prova att instansiera den med hjälp FindSystemTimeZoneById av metoden .
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 ärSerializeTimeZoneData.SerializedTimeZones
resursens 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). GetExecutingAssemblyOm 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.
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