.NET Core’da MessagePack İle Binary Serialization
Merhaba,
Bu içeriğimizde, programlama süreçlerinde verilerimizi binary olarak kat be kat fazla performansla serileştirmemizi sağlayacak olan MessagePack kütüphanesini .NET Core eşliğinde inceliyor olacağız. İçeriğimiz boyunca MessagePack kütüphanesi nedir? hangi teknolojiler tarafından tercih edilmektedir? ne şekilde kullanılmaktadır? vs. gibisinden soruları cevaplandırmaya çalışarak konuya dair tam teferruatlı bir inceleme gerçekleştirmeye çalışıyor olacağız. O halde vakit kaybetmeksizin buyrun başlayalım…
MessagePack Nedir?
It’s like JSON.
but fast and small.
MessagePack, oldukça performanslı ve verimli bir binary serialization kütüphanesidir. Kullanım amacı veriyi transfer edilecek formata dönüştürmek ya da gelen veriyi kullanılabilir forma uydurabilmektir. Haliyle JSON gibi birden çok dil ve platform arasında veri transferi gerçekleştirmemizi sağlamaktadır ve bu işlemi son derece hızlı bir sıkıştırma algoritması olan LZ4 algoritmasını kullanarak binary formatta sağlayabildiği için JSON’a nazaran daha hızlı ve daha küçük boyutlarda gerçekleştirebilmektedir. Tabi bu durum MessagePack’in sadece binary formatta çalıştığı anlamına gelmemektedir. İstek yahut ihtiyaç doğrultusunda JSON türünde de hizmet sunabilmekte amma velakin esas nitelik olarak binary serialization özelliği ön plana çıkmaktadır.
MessagePack Tarafından Desteklenen Programlama Dilleri Nelerdir?
MessagePack içerisinde C#, C, Pyhton, JavaScript, Ruby, Java, Php, Node.JS, Perl, Erlang, Go vs. olmak üzere 50’yi aşkın programlama dili tarafından desteklenen güncel ve popüler bir kütüphanedir.
MessagePack’i Kullanan Günümüz Teknolojileri Nelerdir?
Bu sorunun cevabını MessagePack kütüphanesinin resmi sitesi olan msgpack.org adresinden alabilirsiniz. İlgili siteye girdiğiniz taktirde sol altta mevzu bahis kütüphaneyi kullanan günümüzün ciddi markalarını ve bu markalar tarafından yapılmış olan yorumları görebilmektesiniz.
MessagePack Kurulumu ve Kullanımı
- Kurulum
MessagePack kütüphanesini kurabilmek için Package Manager Console’da
Install-Package MessagePack -Version 2.3.75talimatını verebilir ya da Powershell üzerindendotnet add package MessagePack --version 2.3.75dotnet cli komutunu verebilirsiniz. - Kullanım
MessagePack kütüphanesinin kullanımı oldukça basittir. Misal olarak aşağıdaki ‘Person’ nesnesini ilgili kütüphane ile serileştirmek istiyorsak eğer[MessagePackObject] public class Person { [Key("name")] public string Name { get; set; } [Key("surname")] public string Surname { get; set; } [Key("age")] public int Age { get; set; } }şeklinde çalışılması yeterlidir. Dikkat ederseniz serileştirilecek sınıf
MessagePackObjectattribute’u ile işaretlenerek, property’lerin hangi isimlerde basılacağınınKeyattribute’u ile bildirilmesi yeterli olacaktır. Ardından serileştirme işlemi için aşağıdaki şekildestatic void Main(string[] args) { Person person = new() { Age = 30, Name = "Gençay", Surname = "Yıldız" }; byte[] bytes = MessagePackSerializer.Serialize(person); Person p = MessagePackSerializer.Deserialize<Person>(bytes); }MessagePackSerializerstatic sınıfı eşliğinde çalışılması yeterlidir. Ayrıca burada her bir property içinKeyattribute’unun tanımlanması zorunludur! Zorunlu olması istenmiyorsaMessagePackObjectattribute’uMessagePackObject(true)olarak belirtilebilir ve böylece her property’nin key’ini otomatik olarak kendi ismi olarak ayarlayabilirsiniz.Serileştirme sürecinde göz ardı edilmesi istenilen property’ler
IgnoreMemberattribute’u ile işaretlenmelidir.[MessagePackObject] public class Person { . . . [IgnoreMember] public int Age { get; set; } } - Binary Veriyi JSON Olarak Elde Etmek
MessagePack ile binary olarak serileştirilmiş bir veriyi JSON formatında elde etmek istiyorsak eğerMessagePackSerializerstatic sınıfınınConvertToJsonmetodu aşağıdaki gibi kullanılabilir.static void Main(string[] args) { Person person = new() { Age = 30, Name = "Gençay", Surname = "Yıldız" }; byte[] bytes = MessagePackSerializer.Serialize(person); string json = MessagePackSerializer.ConvertToJson(bytes); } - Veriyi Direkt JSON’a Serilize Etme
Herhangi bir object’i MessagePack aracılığıyla direkt olarak JSON’a serilize edebilmek içinMessagePackSerializerstatic sınıfınınSerializeToJsonmetodu kullanılabilir.static void Main(string[] args) { Person person = new() { Age = 30, Name = "Gençay", Surname = "Yıldız" }; string json = MessagePackSerializer.SerializeToJson(person); } - Struct veya Record Yapılanmalarında Serilizasyon İşlemi
MessagePack; class’lar da olduğu gibi struct ve record yapılanmalarında da serilizasyon işlemi gerçekleştirebilmektedir. Misal olarak aşağıda bir record modelinin serilize ve deserilize işlemlerini inceleyebilirsiniz.[MessagePackObject] public record MyRecord([property: Key("myProperty1")] int MyProperty1, [property: Key("myProperty2")] string MyProperty2) { }static void Main(string[] args) { MyRecord record = new(199, "bla bla bla"); byte[] bytes = MessagePackSerializer.Serialize(record); MyRecord myRecord = MessagePackSerializer.Deserialize<MyRecord>(bytes); }Burada dikkat edilmesi gereken husus ilgili record modelinin access modifier’ının public olarak ayarlanmasıdır. Aksi taktirde serilizasyon sürecinde aşağıdaki hatayla karşılaşılacaktır.
MessagePack.MessagePackSerializationException: ‘Failed to serialize ConsoleApp1.MyRecord value.’ - Serialization Callback
Bazen serilizasyon sürecinde öncü ve artçı kontroller yapmak isteyebiliriz. Bunun için serilize edilecek modeleIMessagePackSerializationCallbackReceiverarayüzü uygulanarakOnBeforeSerializeveOnAfterDeserializemetotları eşliğinde bu işlemleri gerçekleştirebiliriz.[MessagePackObject(true)] public class Person : IMessagePackSerializationCallbackReceiver { . . . public void OnBeforeSerialize() { Console.WriteLine("Serilizasyon öncesi..."); } public void OnAfterDeserialize() { Console.WriteLine("Serilizasyon sonrası..."); } } - Güvenlik
Serilizasyon ve deserilazyon süreçlerinde dikkat edilmesi gereken bir hususta güvenilir olmayan kaynaklardan gelen verilerdir. Güvenilmeyen veriler belli başlı kodları yürütebilir ve uygulamayı olumsuz olarak etkileyebilir. Bunun için MessagePack kütüphanesinde, güvenilir olmayan veriler üzerinde işlem gerçekleştirirken aşağıdaki gibi güvenli moda geçiş sağlanabilmektedir.static void Main(string[] args) { Person person = new(); byte[] bytes = MessagePackSerializer.Serialize(person); MessagePackSerializerOptions options = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData); Person person2 = MessagePackSerializer.Deserialize<Person>(bytes, options); }Yukarıdaki kod bloğunda görüldüğü üzere
MessagePackSerializerOptionstüründen bir nesne üzerinden ilgili verinin güvenilir olmadığı bildirilerek güvenli moda geçiş yapıp işlemler yürütülebilmektedir. - Key(Indexed) Attribute’u
Bir nesnenin serileştirilmesi sürecindeKeyattribute’u ile property’lerinin işaretlenmesi gerektiğini önceden konuşmuştuk.Keyattribute’u, string ve int olmak üzere iki parametre almaktadır. Burada performans açısından string’in daha ideal olduğundan bahsedilmektedir. Aynı zamanda hata ayıklama süreçlerinde string olarak verilmiş değerler, int değerlere nazaran hatanın yakalanmasında daha anlamlı neticeler dönebilmektedir. Eğer ki,Keyattribute’u int olarak kullanılacaksa bunun 0’dan başlayarak ardışık bir şekilde belirtilmiş olması gerekmektedir. Bu durumda ilgili model üzerinde yeni bir property’nin eklenmesi yahut silinmesi durumlarına istinaden ardışık düzenin tekrar sağlanması için baştan sona elden geçirilmesi gerektiği anlamına gelmektedir. AyrıcaKeydeğerlerinin ardışık olmadığı bir serilizasyon neticesinde ilgili property değerleri arasında karşılığı olmayan noktaların null olarak geldiği görülecektir.Misal olarak aşağıdaki kod bloğunu inceleyebilirsiniz;
[MessagePackObject] public class Person { [Key(2)] public string Name { get; set; } [Key(5)] public string Surname { get; set; } [Key(7)] public int Age { get; set; } }static void Main(string[] args) { Person person = new() { Age = 30, Name = "Gençay", Surname = "Yıldız" }; string serialized = MessagePackSerializer.SerializeToJson(person); Console.WriteLine(serialized); }
Nihai olarak;
Günümüz yazılımlarının farklı uygulamalarla entegrasyon süreçlerinde özellikle verileri serilizasyona tabi tutarak haberleşmeyi gerçekleştirmelerinin önem kazandığı şu günlerde buradaki maliyet bizler açısından oldukça kritik arz etmekte ve minimize edilmeyi gerektirmektedir. Dolayısıyla bizlerde MessagePack gibi güzel ve performanslı bir kütüphaneyle verilerimizi binary formatı hedefleyen dönüşümlerle daha hızlı ve dinamik bir şekilde serileştirebilmekte ve gerekli işlemlere yahut farklı servislere sunabilmekteyiz…
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

