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
- Serializace a upgrade
- Referenční informace pro vývojáře pro Reliable Collections
- Upgrade aplikace pomocí sady Visual Studio vás provede upgradem aplikace pomocí sady Visual Studio.
- Upgrade aplikace pomocí PowerShellu vás provede upgradem aplikace pomocí PowerShellu.
- Pomocí parametrů upgradu můžete řídit způsob upgradu vaší aplikace.
- Informace o používání pokročilých funkcí při upgradu aplikace najdete v pokročilých tématech.
- Při řešení běžných problémů s upgrady aplikací postupujte podle kroků v tématu Řešení potíží s upgrady aplikací.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro