Serialization
03/02/2023
Serialization in Ignite.NET
Ignite .NET API'sinden geçen kullanıcı tanımlı sınıfların çoğu, ağ üzerinden diğer cluster nodelarına aktarılacaktır. Bu sınıflar şunları içerir:
Cache keyler ve valueları
Cache processor’leri ve filtreler (
ICacheEntryProcessor
,ICacheEntryFilter
,ICacheEntryEventFilter
,ICacheEntryEventListener
)Compute functionları(
IComputeFunc
), actionları(IComputeAction
) ve jobları(IComputeJob
)Hizmetler (IService)
Evebt ve Mesaj işleyicileri (
IEventListener
,IEventFilter
,IMessageListener
)
Bu sınıfların nesnelerini ağ üzerinden geçirmek serialization gerektirir. Ignite .NET, kullanıcı verilerini serialize etmenin aşağıdaki yollarını destekler:
Apache.Ignite.Core.Binary.IBinarizable
interfaceApache.Ignite.Core.Binary.IBinarySerializer
interfaceSystem.Runtime.Serialization.ISerializable
interfaceIgnite reflective serialization (yukarıdakilerin hiçbiri geçerli olmadığında)
IBinarizable
IBinarizable
yaklaşımı, serialization üzerinde ayrıntılı bir kontrol sağlar. Bu, yüksek performanslı production kodu için tercih edilen bir yoldur.
İlk olarak, sınıfınızda IBinarizable
interface’ini uygulayın:
IBinarizable
, alan adları olmadan raw modda da uygulanabilir. Bu, en hızlı ve en kompakt serialization’u sağlar, ancak SQL sorgularını devre dışı bırakır:
Automatic GetHashCode and Equals Implementation
Bir nesne binary bir biçimde serialize edilebiliyorsa, Ignite serialization sırasında hash kodunu hesaplayacak ve onu elde edilen binary array’e yazacaktır. Ayrıca Ignite, binary nesnenin karşılaştırma gereksinimleri için equals methodunun özel bir implementasyonunu sağlar. Bu, Ignite'ta kullanılmaları için custom key’lerin ve valueların GetHashCode ve Equals methodlarını geçersiz kılmanız gerekmediği anlamına gelir.
IBinarySerializer
IBinarySerializer
, IBinarizable
'a benzer, ancak serialization mantığını class implementasyonundan ayırır. Bu, sınıf kodu değiştirilemediğinde ve serialization mantığı birden çok sınıf arasında paylaşıldığında yararlı olabilir. Aşağıdaki kod, yukarıdaki Address
örneğindekiyle tam olarak aynı serialization’a sahiptir:
Oluşturulan serializer aşağıdaki şekilde yapılandırmada belirtilmelidir:
ISerializable
System.Runtime.Serialization.ISerializable
interface’ini implemente eden türler buna göre serialize edilir (GetObjectData
ve serialization constructor’u çağrılarak). Tüm sistem özellikleri desteklenir: IObjectReference
, IDeserializationCallback
, OnSerializingAttribute
, OnSerializedAttribute
, OnDeserializingAttribute
, OnDeserializedAttribute
.
GetObjectData
sonucu, Ignite’a binary biçiminde yazılır. Aşağıdaki üç sınıf, aynı serialize edilmiş temsili sağlar:
Ignite Reflective Serialization
Ignite reflective serialization, esas olarak interface’in tüm alanları yansıtarak ve yazma/okuma çağrıları yayarak otomatik olarak implemte edildiği IBinarizable
yaklaşımıdır.
Bu mekanizma için herhangi bir gereksinim yoktur, tüm sistem türleri, delegateler, expression tree’ler veya anonymous type’lar dahil olmak üzere herhangi bir sınıf veya yapı serialize edilebilir.
Serialization sırasında belirli alanları filtrelemek için [NonSerialized]
özelliğini kullanın.
Raw mod, BinaryReflectiveSerializer
doğrudan belirtilerek etkinleştirilebilir:
Aksi takdirde, BinaryConfiguration
gerekli değildir.
Performans, manuel IBinarizable
yaklaşımıyla aynıdır. Reflection, alanlar üzerinde yineleme yapmak ve verimli IL kodu yaymak için yalnızca başlangıçta kullanılır.
[Serializable]
attribute’u ile işaretlenen ancak ISerializable
interface’i olmayan tipler, Ignite reflective serializer ile yazılır.
Last updated
Was this helpful?