如何:从嵌入的资源还原时区

本主题介绍如何还原已保存在资源文件中的时区。 有关保存时区的信息和说明,请参阅如何:将时区保存到嵌入的资源中

从嵌入的资源反序列化 TimeZoneInfo 对象

  1. 如果要检索的时区不是自定义时区,请尝试使用 FindSystemTimeZoneById 方法将它实例化。

  2. 通过传递嵌入的资源文件的完全限定的名称和对包含该资源文件的程序集的引用来实例化 ResourceManager 对象。

    如果无法确定嵌入的资源文件的完全限定的名称,请使用 Ildasm.exe (IL Disassembler) 检查程序集清单。 .mresource 项标识资源。 在本示例中,资源的完全限定的名称为 SerializeTimeZoneData.SerializedTimeZones

    如果资源文件嵌入到包含时区实例化代码的同一个程序集中,则你可以通过调用 static(Visual Basic 中为 SharedGetExecutingAssembly 方法来检索对该程序集的引用。

  3. 如果 FindSystemTimeZoneById 方法调用失败,或者如果要实例化自定义时区,请通过调用 ResourceManager.GetString 方法来检索包含已序列化的时区的字符串。

  4. 通过调用 FromSerializedString 方法来反序列化时区数据。

示例

以下示例对存储在嵌入的 .NET XML 资源文件中的 TimeZoneInfo 对象进行反序列化。

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

此代码演示为确保应用程序所需的 TimeZoneInfo 对象存在而进行的异常处理。 它首先尝试使用 FindSystemTimeZoneById 方法,从注册表中检索 TimeZoneInfo 对象来实例化该对象。 如果无法实例化时区,此代码会从嵌入的资源文件中检索该时区。

因为自定义时区(使用 CreateCustomTimeZone 方法实例化的时区)不存储在注册表中,所以此代码不调用 FindSystemTimeZoneById 来实例化南极洲帕麦尔的时区。 而是立即使用嵌入的资源文件来检索包含该时区数据的字符串,然后再调用 FromSerializedString 方法。

编译代码

此示例需要:

  • 向项目添加对 System.Windows.Forms.dll and System.Core.dll 的引用。

  • 导入以下命名空间:

    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
    

另请参阅