Como: Restaurar fusos horários a partir de um recurso incorporado
Este tópico descreve como restaurar fusos horários que foram salvos em um arquivo de recurso. Para obter informações e instruções sobre como salvar fusos horários, consulte Como salvar fusos horários em um recurso incorporado.
Para desserializar um objeto TimeZoneInfo de um recurso incorporado
Se o fuso horário a ser recuperado não for um fuso horário personalizado, tente instanciá-lo usando o FindSystemTimeZoneById método.
Instancie um ResourceManager objeto passando o nome totalmente qualificado do arquivo de recurso incorporado e uma referência ao assembly que contém o arquivo de recurso.
Se não for possível determinar o nome totalmente qualificado do arquivo de recurso incorporado, use o Ildasm.exe (IL Disassembler) para examinar o manifesto do assembly. Uma
.mresource
entrada identifica o recurso. No exemplo, o nome totalmente qualificado do recurso éSerializeTimeZoneData.SerializedTimeZones
.Se o arquivo de recurso estiver incorporado no mesmo assembly que contém o código de instanciação de fuso horário, você poderá recuperar uma referência a ele chamando o
static
método (Shared
no Visual Basic GetExecutingAssembly ).Se a chamada para o método falhar ou se um fuso FindSystemTimeZoneById horário personalizado for instanciado, recupere uma cadeia de caracteres que contenha o fuso horário serializado chamando o ResourceManager.GetString método.
Desserialize os dados de fuso horário chamando o FromSerializedString método.
Exemplo
O exemplo a seguir desserializa um TimeZoneInfo objeto armazenado em um arquivo de recurso XML .NET incorporado.
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
Este código ilustra o tratamento de exceções para garantir que um TimeZoneInfo objeto exigido pelo aplicativo esteja presente. Ele primeiro tenta instanciar um TimeZoneInfo objeto recuperando-o do registro usando o FindSystemTimeZoneById método. Se o fuso horário não puder ser instanciado, o código o recuperará do arquivo de recurso incorporado.
Como os dados para fusos horários personalizados (fusos horários instanciados usando o CreateCustomTimeZone método) não são armazenados no registro, o código não chama o FindSystemTimeZoneById para instanciar o fuso horário para Palmer, Antarctica. Em vez disso, ele procura imediatamente o arquivo de recurso incorporado para recuperar uma cadeia de caracteres que contém os dados do fuso horário antes de chamar o FromSerializedString método.
Compilação do código
Este exemplo requer:
Que uma referência a System.Windows.Forms.dll e System.Core.dll ser acrescentada ao projeto.
Que os seguintes namespaces sejam importados:
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