Sdílet prostřednictvím


Spolehlivá serializace objektů kolekce v Azure Service Fabric

Spolehlivé kolekce replikují a uchovávají své položky, aby se ujistily, že jsou odolné napříč selháními počítačů a výpadky napájení. Pro replikaci i uchování položek je potřeba serializovat spolehlivé kolekce.

Reliable Collections získá odpovídající serializátor pro daný typ z Reliable State Manager. Reliable State Manager obsahuje integrované 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 je bylo možné serializovat efektivně ve výchozím nastavení. U jiných typů se Správce spolehlivého stavu vrátí zpět k použití DataContractSerializer. Předdefinované serializátory jsou efektivnější, protože znají, že jejich typy nemohou změnit a nemusí obsahovat informace o typu, jako je název jeho typu.

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

  • Guid
  • bool
  • byte
  • sbyte
  • byte[]
  • char
  • string
  • decimal
  • double
  • float (číslo s plovoucí řádovou čárkou)
  • 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 přes drát 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> se používá k registraci vlastního serializátoru pro daný typ T. Tato registrace by měla probíhat ve konstrukci StatefulServiceBase, aby se zajistilo, že před zahájením obnovení mají všechny spolehlivé kolekce přístup k příslušnému serializátoru ke čtení 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 při registraci vlastního serializátoru pro int se používá k serializaci celých čísel místo integrovaného serializátoru pro int.

Postup implementace vlastního serializátoru

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

Poznámka:

IStateSerializer<T> zahrnuje přetížení pro zápis a čtení, které přebírá další T volal základní hodnotu. Toto rozhraní API slouží k rozdílové serializaci. V současné době není funkce rozdílového serializace vystavena. Proto tyto dvě přetížení nejsou volána, dokud se rozdílové serializace nezobrazí a povolí.

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 přetížení pro čtení a zápis, která přebírají v baseValue, volají jejich odpovídající přetížení pro přesměrovávat kompatibilitu.

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 postupném upgradu aplikace se upgrade použije na podmnožinu uzlů, jednu doménu upgradu najednou. Během tohoto procesu budou některé upgradovací domény v novější verzi aplikace a některé upgradovací domény budou ve starší verzi vaší aplikace. Během zavádění musí být nová verze aplikace schopná číst starou verzi dat a stará verze aplikace musí být schopná přečíst novou verzi dat. Pokud formát dat není dopředu a zpětně kompatibilní, upgrade může selhat nebo horší, 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, musí být data nekonečně zpětně a dopředu kompatibilní. Jinými slovy, každá verze serializátoru musí být schopna serializovat a de-serializovat libovolnou verzi typu.

Uživatelé kontraktu dat by měli dodržovat dobře definovaná pravidla správy verzí pro přidávání, odebírání a změny polí. Kontrakt dat má také podporu pro práci s neznámými poli, připojení k serializaci a deserializaci procesu a zpracování dědičnosti tříd. Další informace naleznete 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 si každá verze dokáže přečíst co nejvíce a přeskočit zbývající část datového proudu.

Další kroky