Como: Restaurar os fusos horários de um recurso incorporado
Este tópico descreve como restaurar zonas de tempo que foram salvas em um arquivo de recurso. Para obter informações e instruções sobre como salvar zonas de tempo, consulte Como: Salvar os fusos horários para um recurso incorporado.
Para desserializar um objeto TimeZoneInfo de um recurso incorporado
Se a zona de tempo a ser recuperada não for uma zona de tempo personalizada, tente instanciá-la usando o método FindSystemTimeZoneById.
Crie uma instância de um objeto ResourceManager passando o nome totalmente qualificado do arquivo de recurso incorporado e uma referência ao assembly que contém o arquivo de recurso.
Se você não conseguir determinar o nome totalmente qualificado do arquivo de recurso incorporado, utilize o Ildasm. exe (desmontador MSIL) 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 está incorporado no mesmo assembly que contém o código de instanciação da zona de tempo, você pode recuperar uma referência a ele chamando o método static (Shared no Visual Basic) GetExecutingAssembly.
Se a chamada ao método FindSystemTimeZoneById falhar, ou se uma zona de tempo personalizada está para ser instanciada, recupere uma sequência de caracteres que contenha a zona de tempo serializada chamando o método ResourceManager.GetString.
Desserialize os dados da zona de tempo chamando o método FromSerializedString.
Exemplo
O exemplo a seguir desserializa um objeto TimeZoneInfo armazenado em um arquivo XML de recurso .NET incorporado.
Private Sub DeserializeTimeZones()
Dim cst, palmer As TimeZoneInfo
Dim timeZoneString As String
Dim resMgr As ResourceManager = New ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly)
' 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
private void DeserializeTimeZones()
{
TimeZoneInfo cst, palmer;
string timeZoneString;
ResourceManager resMgr = new ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly());
// 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;
}
}
Esse código ilustra a manipulação de exceção para garantir que um objeto TimeZoneInfo, exigido pelo aplicativo, esteja presente. Ele primeiro tenta criar uma instância de um objeto TimeZoneInfo, pela recuperação dele a partir do registro, usando o método FindSystemTimeZoneById. Se a zona de tempo não puder ser instanciada, o código a recupera do arquivo de recurso incorporado.
Pelo fato dos dados de zonas de tempo personalizadas (zonas de tempo instanciadas usando-se o método CreateCustomTimeZone) não serem armazenados no registro, o código não chama o FindSystemTimeZoneById para instanciar a zona de tempo para Palmer, Antártica. Em vez disso, ele imediatamente verifica o arquivo de recurso incorporado para recuperar uma sequência de caracteres que contenha os dados da zona de tempo, antes dele 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 espaços de nome sejam importados:
Imports System.Globalization Imports System.IO Imports System.Reflection Imports System.Resources
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;
Consulte também
Tarefas
Como: Salvar os fusos horários para um recurso incorporado