Procedure: Tijdzones herstellen vanuit een ingesloten resource
In dit onderwerp wordt beschreven hoe u tijdzones herstelt die zijn opgeslagen in een resourcebestand. Zie Hoe kunt u tijdzones besparen voor informatie en instructies over het besparen van tijdzones : Tijdzones opslaan in een ingesloten resource.
Een TimeZoneInfo-object deserialiseren vanuit een ingesloten resource
Als de te ophalen tijdzone geen aangepaste tijdzone is, probeert u deze te instantiëren met behulp van de FindSystemTimeZoneById methode.
Instantieer een ResourceManager object door de volledig gekwalificeerde naam van het ingesloten resourcebestand door te geven en een verwijzing naar de assembly die het resourcebestand bevat.
Als u de volledig gekwalificeerde naam van het ingesloten resourcebestand niet kunt bepalen, gebruikt u de Ildasm.exe (IL Disassembler) om het manifest van de assembly te onderzoeken. Een
.mresource
vermelding identificeert de resource. In het voorbeeld isSerializeTimeZoneData.SerializedTimeZones
de volledig gekwalificeerde naam van de resource.Als het resourcebestand is ingesloten in dezelfde assembly die de instantiecode van de tijdzone bevat, kunt u er een verwijzing naar ophalen door de
static
methode (Shared
in Visual Basic) GetExecutingAssembly aan te roepen.Als de aanroep naar de FindSystemTimeZoneById methode mislukt of als een aangepaste tijdzone moet worden geïnstantieerd, haalt u een tekenreeks op die de geserialiseerde tijdzone bevat door de ResourceManager.GetString methode aan te roepen.
Deserialiseer de tijdzonegegevens door de methode aan te FromSerializedString roepen.
Opmerking
In het volgende voorbeeld wordt een TimeZoneInfo object gedeserialiseerd dat is opgeslagen in een ingesloten .NET XML-resourcebestand.
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
Deze code illustreert de verwerking van uitzonderingen om ervoor te zorgen dat een TimeZoneInfo object aanwezig is dat door de toepassing is vereist. Eerst wordt geprobeerd een TimeZoneInfo object te instantiëren door het op te halen uit het register met behulp van de FindSystemTimeZoneById methode. Als de tijdzone niet kan worden geïnstantieerd, haalt de code deze op uit het ingesloten resourcebestand.
Omdat gegevens voor aangepaste tijdzones (tijdzones die met behulp van de CreateCustomTimeZone methode worden geïnstantieerd) niet in het register worden opgeslagen, roept de code de FindSystemTimeZoneById code niet aan om de tijdzone voor Palmer, Antarctica te instantiëren. In plaats daarvan wordt er onmiddellijk naar het ingesloten resourcebestand gezocht om een tekenreeks op te halen die de gegevens van de tijdzone bevat voordat de methode wordt FromSerializedString aangeroepen.
De code compileren
Voor dit voorbeeld is het volgende vereist:
Dat een verwijzing naar System.Windows.Forms.dll en System.Core.dll aan het project worden toegevoegd.
De volgende naamruimten worden geïmporteerd:
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