Bagikan melalui


Panduan: Memulihkan zona waktu dari sumber daya yang disematkan

Topik ini menjelaskan cara memulihkan zona waktu yang telah disimpan dalam file sumber daya. Untuk informasi dan instruksi tentang menyimpan zona waktu, lihat Cara: Menyimpan zona waktu ke sumber daya yang disematkan.

Untuk mendeserialisasi objek TimeZoneInfo dari sumber daya yang disematkan

  1. Jika zona waktu yang akan diambil bukan zona waktu kustom, coba buat instans dengan menggunakan FindSystemTimeZoneById metode.

  2. Membuat instans ResourceManager objek dengan meneruskan nama file sumber daya yang sepenuhnya memenuhi syarat dan referensi ke rakitan yang berisi file sumber.

    Jika Anda tidak dapat menentukan nama file sumber yang sepenuhnya memenuhi syarat, gunakan Ildasm.exe (IL Disassembler) untuk memeriksa manifes assembly. Entri .mresource mengidentifikasi sumber daya. Dalam contoh, nama sumber daya yang sepenuhnya memenuhi syarat adalah SerializeTimeZoneData.SerializedTimeZones.

    Jika file sumber disematkan dalam assembly yang sama yang berisi kode instansiasi zona waktu, Anda dapat mengambil referensi ke file tersebut static dengan memanggil metode (Shared dalam Visual Basic). GetExecutingAssembly.

  3. Jika panggilan ke FindSystemTimeZoneById metode gagal, atau jika zona waktu kustom akan dibuat, ambil string yang berisi zona waktu yang diserialisasikan dengan memanggil ResourceManager.GetString metode.

  4. Mendeserialisasikan data zona waktu dengan memanggil FromSerializedString metode.

Contoh

Contoh berikut mendeserialisasikan objek yang TimeZoneInfo disimpan dalam file sumber .NET XML yang disematkan.

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

Kode ini menggambarkan penanganan pengecualian untuk memastikan bahwa objek yang TimeZoneInfo diperlukan oleh aplikasi ada. Pertama-tama mencoba membuat instans TimeZoneInfo objek dengan mengambilnya dari registri menggunakan FindSystemTimeZoneById metode. Jika zona waktu tidak dapat dibuat, kode mengambilnya dari file sumber yang disematkan.

Karena data untuk zona waktu kustom (zona waktu yang dibuat dengan menggunakan CreateCustomTimeZone metode ) tidak disimpan dalam registri, kode tidak memanggil FindSystemTimeZoneById untuk membuat instans zona waktu untuk Palmer, Antartika. Sebagai gantinya, segera melihat ke file sumber yang disematkan untuk mengambil string yang berisi data zona waktu sebelum memanggil FromSerializedString metode.

Mengompilasi kode

Contoh ini membutuhkan:

  • Bahwa referensi ke System.Windows.Forms.dll dan System.Core.dll ditambahkan ke proyek.

  • Bahwa namespace layanan berikut diimpor:

    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
    

Lihat juga