Bagikan melalui


Serialisasi objek Reliable Collection di Azure Service Fabric

Reliable Collection mereplikasi dan mempertahankan item-itemnya untuk memastikan bahwa item-item tersebut bertahan di seluruh kegagalan komputer dan pemadaman listrik. Baik untuk mereplikasi dan untuk mempertahankan item, Reliable Collection perlu melakukan serialisasi atas item-item tersebut.

Reliable Collection mendapatkan serializer yang sesuai untuk jenis tertentu dari Reliable State Manager. Reliable State Manager berisi serializer bawaan dan memungkinkan serializer kustom didaftarkan untuk jenis tertentu.

Serializer Bawaan

Reliable State Manager mencakup serializer bawaan untuk beberapa jenis umum, sehingga dapat diserialisasikan secara efisien secara default. Untuk jenis lain, Reliable State Manager kembali menggunakan DataContractSerializer. Serializer bawaan lebih efisien karena tahu jenisnya tidak dapat berubah dan tidak perlu menyertakan informasi tentang jenis seperti nama jenisnya.

Reliable State Manager memiliki serializer bawaan untuk jenis berikut:

  • Guid
  • bool
  • byte
  • sbyte
  • byte[]
  • char
  • string
  • decimal
  • double
  • float
  • int
  • uint
  • long
  • ulong
  • short
  • ushort

Serialisasi Kustom

Serializer kustom umumnya digunakan untuk meningkatkan kinerja atau untuk mengenkripsi data melalui kawat dan di disk. Di antara alasan lain, serializer kustom biasanya lebih efisien daripada serializer generik karena tidak perlu menserialisasikan informasi tentang jenisnya.

IReliableStateManager.TryAddStateSerializer<T> digunakan untuk mendaftarkan serializer kustom untuk jenis T yang diberikan. Pendaftaran ini harus terjadi dalam konstruksi StatefulServiceBase guna memastikan bahwa sebelum pemulihan dimulai, semua Reliable Collection memiliki akses ke serializer yang relevan untuk membaca data mereka yang dipertahankan.

public StatefulBackendService(StatefulServiceContext context)
  : base(context)
  {
    if (!this.StateManager.TryAddStateSerializer(new OrderKeySerializer()))
    {
      throw new InvalidOperationException("Failed to set OrderKey custom serializer");
    }
  }

Catatan

Serializer kustom diutamakan daripada serializer bawaan. Misalnya, ketika serializer kustom untuk int terdaftar, ini digunakan untuk menserialisasikan bilangan bulat, alih-alih serializer bawaan untuk int.

Cara mengimplementasikan serializer kustom

Serializer kustom perlu mengimplementasikan antarmuka IStateSerializer<T>.

Catatan

IStateSerializer<T> mencakup kelebihan beban untuk Tulis and Baca yang mengambil T tambahan, disebut sebagai nilai dasar. API ini untuk serialisasi diferensial. Saat ini, fitur serialisasi diferensial tidak terekspos. Oleh karena itu, kedua beban ini tidak disebut sampai serialisasi diferensial diekspos dan diaktifkan.

Berikut adalah contoh jenis kustom yang disebut OrderKey yang berisi empat properti

public class OrderKey : IComparable<OrderKey>, IEquatable<OrderKey>
{
    public byte Warehouse { get; set; }

    public short District { get; set; }

    public int Customer { get; set; }

    public long Order { get; set; }

    #region Object Overrides for GetHashCode, CompareTo and Equals
    #endregion
}

Berikut ini adalah contoh implementasi IStateSerializer<OrderKey>. Perhatikan bahwa kelebihan beban Baca dan Tulis yang terjadi di baseValue, memanggil kelebihan beban masing-masing untuk meneruskan kompatibilitas.

public class OrderKeySerializer : IStateSerializer<OrderKey>
{
  OrderKey IStateSerializer<OrderKey>.Read(BinaryReader reader)
  {
      var value = new OrderKey();
      value.Warehouse = reader.ReadByte();
      value.District = reader.ReadInt16();
      value.Customer = reader.ReadInt32();
      value.Order = reader.ReadInt64();

      return value;
  }

  void IStateSerializer<OrderKey>.Write(OrderKey value, BinaryWriter writer)
  {
      writer.Write(value.Warehouse);
      writer.Write(value.District);
      writer.Write(value.Customer);
      writer.Write(value.Order);
  }
  
  // Read overload for differential de-serialization
  OrderKey IStateSerializer<OrderKey>.Read(OrderKey baseValue, BinaryReader reader)
  {
      return ((IStateSerializer<OrderKey>)this).Read(reader);
  }

  // Write overload for differential serialization
  void IStateSerializer<OrderKey>.Write(OrderKey baseValue, OrderKey newValue, BinaryWriter writer)
  {
      ((IStateSerializer<OrderKey>)this).Write(newValue, writer);
  }
}

Peningkatan

Dalam menggulir peningkatan aplikasi bergulir, peningkatan diterapkan ke subset node, satu domain peningkatan pada satu waktu. Selama proses ini, beberapa domain peningkatan akan berada dalam versi aplikasi Anda yang lebih baru, dan beberapa domain peningkatan akan berada dalam versi lama aplikasi Anda. Selama peluncuran, versi baru aplikasi Anda harus dapat membaca versi lama data Anda, dan versi lama aplikasi Anda harus dapat membaca versi baru data Anda. Jika format data tidak kompatibel ke depan dan ke belakang, peningkatan mungkin gagal, atau lebih buruk, data mungkin hilang atau rusak.

Jika Anda menggunakan serializer bawaan, Anda tidak perlu khawatir tentang kompatibilitasnya. Namun, jika Anda menggunakan serializer kustom atau DataContractSerializer, data harus kompatibel mundur dan maju tanpa batas. Dengan kata lain, setiap versi serializer harus dapat menserialisasikan dan mendeserialisasi versi apa pun dari jenis tersebut.

Pengguna Kontrak Data harus mengikuti aturan penerapan versi yang ditentukan dengan baik untuk menambahkan, menghapus, dan mengubah bidang. Kontrak Data juga memiliki dukungan untuk menangani bidang yang tidak dikenal, mengaitkan ke dalam proses serialisasi dan deserialisasi, serta menyesuaikan dengan warisan kelas. Untuk informasi selengkapnya, lihat Menggunakan Kontrak Data.

Pengguna serializer kustom harus mematuhi pedoman serializer yang mereka gunakan untuk memastikannya kompatibel mundur dan meneruskan maju. Cara umum untuk mendukung semua versi adalah menambahkan informasi ukuran di awal dan hanya menambahkan properti opsional. Dengan cara ini, setiap versi dapat membaca sebanyak yang bisa dilakukan dan melompati bagian streaming yang tersisa.

Langkah berikutnya