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:
publicclassAddress:IBinarizable{publicstringStreet{get;set;}publicintZip{get;set;}publicvoidWriteBinary(IBinaryWriterwriter){ // Alphabetic field order is required for SQL DML to work. // Even if DML is not used, alphabetic order is recommended.writer.WriteString("street",Street);writer.WriteInt("zip",Zip);}publicvoidReadBinary(IBinaryReaderreader){ // Read order does not matter, however, reading in the same order // as writing improves performance.Street=reader.ReadString("street");Zip=reader.ReadInt("zip");}}
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:
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.
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.
public class Address : IBinarizable
{
public string Street { get; set; }
public int Zip { get; set; }
public void WriteBinary(IBinaryWriter writer)
{
var rawWriter = writer.GetRawWriter();
rawWriter.WriteString(Street);
rawWriter.WriteInt(Zip);
}
public void ReadBinary(IBinaryReader reader)
{
// Read order must be the same as write order
var rawReader = reader.GetRawReader();
Street = rawReader.ReadString();
Zip = rawReader.ReadInt();
}
}
public class Address : IBinarizable
{
public string Street { get; set; }
public int Zip { get; set; }
}
public class AddressSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
var addr = (Address) obj;
writer.WriteString("street", addr.Street);
writer.WriteInt("zip", addr.Zip);
}
public void ReadBinary(object obj, IBinaryReader reader)
{
var addr = (Address) obj;
addr.Street = reader.ReadString("street");
addr.Zip = reader.ReadInt("zip");
}
}
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
TypeConfigurations = new[]
{
new BinaryTypeConfiguration(typeof (Address))
{
Serializer = new AddressSerializer()
}
}
}
};
using (var ignite = Ignition.Start(cfg))
{
...
}
class Reflective
{
public int Id { get; set; }
public string Name { get; set; }
}
class Binarizable : IBinarizable
{
public int Id { get; set; }
public string Name { get; set; }
public void WriteBinary(IBinaryWriter writer)
{
writer.WriteInt("Id", Id);
writer.WriteString("Name", Name);
}
public void ReadBinary(IBinaryReader reader)
{
Id = reader.ReadInt("Id");
Name = reader.ReadString("Name");
}
}
class Serializable : ISerializable
{
public int Id { get; set; }
public string Name { get; set; }
public Serializable() {}
protected Serializable(SerializationInfo info, StreamingContext context)
{
Id = info.GetInt32("Id");
Name = info.GetString("Name");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Id", Id);
info.AddValue("Name", Name);
}
}
var binaryConfiguration = new BinaryConfiguration
{
TypeConfigurations = new[]
{
new BinaryTypeConfiguration(typeof(MyClass))
{
Serializer = new BinaryReflectiveSerializer {RawMode = true}
}
}
};