Практическое руководство. Восстановление часовых поясов из внедренного ресурса
В этом разделе описывается восстановление часовых поясов, которые были сохранены в файле ресурсов. Сведения и инструкции по сохранению часовых поясов см. в разделе Практическое руководство. Сохранение часовых поясов во внедренном ресурсе.
Для десериализации объекта TimeZoneInfo из внедренного ресурса
Если извлекаемый часовой пояс не является пользовательским часовым поясом, попытайтесь создать его экземпляр с помощью метода FindSystemTimeZoneById.
Создайте объект ResourceManager, передав полное имя файла внедренного ресурса и ссылку на сборку, содержащую файл ресурсов.
Если вам не удается определить полное имя внедренного ресурсного файла, используйте Ildasm.exe (дизассемблер MSIL) для проверки манифеста сборки. Элемент .mresource идентифицирует ресурс. В примере полным ресурсным именем является SerializeTimeZoneData.SerializedTimeZones.
Если файл ресурсов внедрен в ту же сборку, которая содержит код экземпляра часового пояса, то можно получить ссылку на него, вызвав метод static (Shared в Visual Basic) GetExecutingAssembly.
При сбое вызова метода FindSystemTimeZoneById или, если необходимо создать пользовательский часовой пояс, можно извлечь строку, содержащую сериализованный часовой пояс, вызвав метод ResourceManager.GetString.
Чтобы десериализовать данные часового пояса, вызовите метод FromSerializedString.
Пример
В следующем примере десериализуется объект TimeZoneInfo, хранящийся во внедренном файле ресурсов .NET XML.
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;
}
}
Этот код иллюстрирует обработку исключений, чтобы обеспечить присутствие объекта TimeZoneInfo, необходимого приложению. Сначала код пробует создать объект TimeZoneInfo, извлекая его из реестра с помощью метода FindSystemTimeZoneById. Если часовой пояс не может быть создан, то код извлекает его из внедренного ресурсного файла.
Так как данные для пользовательских часовых поясов (часовых поясов, созданных с помощью метода CreateCustomTimeZone) не хранятся в реестре, код не осуществляет вызов FindSystemTimeZoneById для создания часового пояса Антарктики. Вместо этого код сразу обращается к файлу внедренных ресурсов, чтобы получить строку, содержащую данные пользовательского часового пояса, прежде чем вызывать метод FromSerializedString.
Компиляция кода
Для этого примера требуется:
Чтобы ссылки на System.Windows.Forms.dll и System.Core.dll были добавлены в проект.
Чтобы был осуществлен импорт следующих пространств имен:
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;
См. также
Задачи
Практическое руководство. Сохранение часовых поясов во внедренном ресурсе
Основные понятия
Общие сведения о часовых поясах