Sdílet prostřednictvím


Serializace objektů Reliable Collection v Azure Service Fabric

Spolehlivé kolekce replikují a uchovávají své položky, aby se zajistilo, že jsou odolné v případě selhání počítače a výpadků napájení. Jak k replikaci, tak k zachování položek, Reliable Collections je potřeba serializovat.

Reliable Collections' získat odpovídající serializátor pro daný typ z Reliable State Manager. Reliable State Manager obsahuje vestavěné serializátory a umožňuje registraci vlastních serializátorů pro daný typ.

Integrované serializátory

Reliable State Manager obsahuje integrovaný serializátor pro některé běžné typy, aby mohly být serializovány efektivně ve výchozím nastavení. U jiných typů Reliable State Manager se vrátí k použití DataContractSerializer. Předdefinované serializátory jsou efektivnější, protože vědí, že jejich typy nelze změnit a nemusí obsahovat informace o typu, jako je jeho název typu.

Reliable State Manager má integrovaný serializátor pro následující typy:

  • Identifikátor GUID
  • bool
  • byte
  • sbyte
  • byte[]
  • char
  • řetězec
  • decimal
  • double
  • float
  • int
  • uint
  • long
  • ulong
  • short
  • ushort

Vlastní serializace

Vlastní serializátory se běžně používají ke zvýšení výkonu nebo k šifrování dat po síti a na disku. Kromě jiných důvodů jsou vlastní serializátory obvykle efektivnější než obecný serializátor, protože nepotřebují serializovat informace o typu.

IReliableStateManager.TryAddStateSerializer< T> slouží k registraci vlastního serializátoru pro daný typ T. K této registraci by mělo dojít při konstrukci StatefulServiceBase, aby se zajistilo, že před zahájením obnovení budou mít všechny spolehlivé kolekce přístup k příslušnému serializátoru ke čtení jejich trvalých dat.

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

Poznámka

Vlastní serializátory mají přednost před integrovanými serializátory. Například, když vlastní serializátor pro int je registrován, slouží k serializaci celých čísel namísto předdefinovaný serializátor pro int.

Jak implementovat vlastní serializátor

Vlastní serializátor musí implementovat IStateSerializer<rozhraní T> .

Poznámka

IStateSerializer<T> zahrnuje přetížení pro zápis a čtení, které přijímá další T s názvem základní hodnota. Toto rozhraní API slouží k rozdílové serializaci. V současné době rozdílové serializace funkce není vystavena. Proto tyto dvě přetížení nejsou volány, dokud je rozdílová serializace zpřístupněna a povolena.

Následuje příklad vlastního typu s názvem OrderKey, který obsahuje čtyři vlastnosti.

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
}

Následuje příklad implementace IStateSerializer<OrderKey>. Všimněte si, že Read a Write přetížení, které přebírají v baseValue, volají své příslušné přetížení pro dopředné kompatibility.

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);
  }
}

Upgradovatelnost

Při upgradu aplikace se zajištěním provozu se upgrade použije na podmnožinu uzlů, postupně po jedné upgradovací doméně. Během tohoto procesu budou některé upgradovací domény v novější verzi vaší aplikace a některé upgradovací domény ve starší verzi aplikace. Během zavádění musí být nová verze vaší aplikace schopná číst starou verzi vašich dat a stará verze aplikace musí být schopná číst novou verzi vašich dat. Pokud formát dat není dopředný a zpětně kompatibilní, upgrade může selhat nebo v horším případě může dojít ke ztrátě nebo poškození dat.

Pokud používáte integrovaný serializátor, nemusíte se starat o kompatibilitu. Pokud však používáte vlastní serializátor nebo DataContractSerializer, data musí být nekonečně zpětně a dopředu kompatibilní. Jinými slovy, každá verze serializátoru musí být schopna serializovat a de-serializovat jakoukoli verzi typu.

Uživatelé smlouvy o datech by měli dodržovat jasně definovaná pravidla správy verzí pro přidávání, odebírání a změny polí. Kontrakt dat má také podporu pro zpracování neznámých polí, připojení do procesu serializace a deserializace a zpracování dědičnosti tříd. Další informace najdete v tématu Použití kontraktu dat.

Uživatelé vlastního serializátoru by měli dodržovat pokyny serializátoru, který používají, aby se zajistilo, že je zpětně a dopředu kompatibilní. Běžným způsobem podpory všech verzí je přidání informací o velikosti na začátku a přidání pouze volitelných vlastností. Díky tomu může každá verze číst co nejvíce a přeskočit zbývající část streamu.

Další kroky