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