Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.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?

.NET Core'da MessagePack İle Binary SerializationBu 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.75 talimatını verebilir ya da Powershell üzerinden dotnet add package MessagePack --version 2.3.75 dotnet 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 MessagePackObject attribute’u ile işaretlenerek, property’lerin hangi isimlerde basılacağının Key attribute’u ile bildirilmesi yeterli olacaktır. Ardından serileştirme işlemi için aşağıdaki şekilde

            static 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);
            }
    

    MessagePackSerializer static sınıfı eşliğinde çalışılması yeterlidir. Ayrıca burada her bir property için Key attribute’unun tanımlanması zorunludur! Zorunlu olması istenmiyorsa MessagePackObject attribute’u MessagePackObject(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 IgnoreMember attribute’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ğer MessagePackSerializer static sınıfının ConvertToJson metodu 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çin MessagePackSerializer static sınıfının SerializeToJson metodu 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.’

    .NET Core'da MessagePack İle Binary Serialization

  • Serialization Callback
    Bazen serilizasyon sürecinde öncü ve artçı kontroller yapmak isteyebiliriz. Bunun için serilize edilecek modele IMessagePackSerializationCallbackReceiver arayüzü uygulanarak OnBeforeSerialize ve OnAfterDeserialize metotları 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 MessagePackSerializerOptions tü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ürecinde Key attribute’u ile property’lerinin işaretlenmesi gerektiğini önceden konuşmuştuk. Key attribute’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, Key attribute’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ıca Key değ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);
            }
    

    .NET Core'da MessagePack İle Binary Serialization

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…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir