Serileştirme 1997’de Java’ya eklendiğinde, biraz riskli olduğu biliniyordu. Yeni teknolojilerde Serialization kullanmamıza artık gerek yok. Yazımızın sonunda Serialization’un risklerinden bahsedeceğiz. İlk olarak bu işlemin tanımını yapalım;
Serileştirme objelerimizi byte streamlerine dönüştürdüğümüz işlemlerdir. Böylece objelerimizi bir dosyaya, veritabanına, hafızaya kaydetme operasyonlarını gerçekleştirebiliriz.
Serileştirme işlemini bir görsel ile açıklayalım:
Resimde görüldüğü üzere objemiz byte stream’e çevrilip veritabanına, dosyaya veya hafızaya kaydediliyor. Bu işlemin tam tersi ise de-serialization olarak adlandırılır.
serialVersionUID Ne İşe Yarar?
Bu özellik serialization ve de-serialization işlemlerinin uyumluluğunu sağlamak için kullanılır. serialVersionUID, serileştirilen nesneyle ilgili bir nevi sürüm kontrol mekanizması sağlar. Bu mekanizma, serileştirilmiş bir nesne ile de-serialization işlemi gerçekleştiren JVM arasında uyumluluğu sağlar. Eğer serileştirilen bir nesnenin serialVersionUID değeri ile de-serialization işlemi sırasında karşılaştırılan serialVersionUID eşleşmiyorsa, InvalidClassException
hatası fırlatılır ve de-serialization işlemi başarısız olur. Eğer sınıfınızda serialVersionUID tanımlamazsanız bu değer Java tarafından oluşturulur. Bildiğim kadarıyla bu maliyetli bir işlem. Detaylarını bu yazımızda paylaşamayacağız çünkü bende bilmiyorum..
Modası Geçmiş Bir Mekanizma
Serileştirme artık modası geçmiş bir teknolojidir. Bu teknolojinin temel sorunu korunması için çok büyük ve sürekli büyüyen bir saldırı yüzeyine sahip olmasıdır: Nesne grafikleri, bir ObjectInputStream üzerinde readObject yöntemi çağrılarak geri deserialize edilir. Bu yöntem, neredeyse her türde nesneleri örneklendirebilecek sihirli bir constructor işlevi görmektedir. Yani deserialization işlemi sıkıntılı bir yöntem kısacası. Korunması gereken çok şey var diyebiliriz.
Yazdığınız herhangi yeni projede serileştirmeyi kullanmak için hiçbir neden yoktur. Java serileştirmenin tehlikelerinden uzak, nesneler ile byte dizileri arasında çeviri yapabilen diğer mekanizmalar mevcuttur. Bu mekanizmalar çeşitli avantajlar sunar, örneğin platformlar arası destek, yüksek performans, geniş bir araç ekosistemi ve geniş bir uzman topluluğu. Bunların arasında en önde gelen ise JSON kütüphanesidir.
Serialization Riskleri
- Güvenlik Riskleri: Serileştirme, nesne durumunu bir dosyaya veya ağ üzerindeki bir akışa yazarken, bu verilerin güvenliği ve doğruluğu garanti edilmez. Zararlı kullanıcılar, serileştirme yoluyla nesneleri manipüle ederek uygulama güvenliğini tehlikeye atabilir veya hassas bilgilere erişebilir.
- Uyum Sorunları: Serileştirme, sınıfların iç durumlarının bir akışa veya dosyaya yazılmasını içerir. Ancak, sınıfların yapısı zamanla değişebilir. Bir nesne serileştirildikten sonra, sınıf yapısı değiştiğinde geri deserializasyon işlemi başarısız olabilir. Bu, uyumsuzluk sorunlarına neden olabilir ve uygulamalarda hatalara yol açabilir.
- Performans Sorunları: Serileştirme, nesnelerin bellekten diske veya ağa yazılmasını veya tersine okunmasını gerektirir. Bu işlem, işlemci ve disk giriş/çıkış kaynaklarını yoğun bir şekilde kullanabilir ve uygulama performansını etkileyebilir. Özellikle büyük veri yapıları serileştirilirse, işlem süresi uzayabilir.
- Gelecekteki Değişiklikler: Serileştirilmiş veriler, nesne yapısındaki gelecekteki değişikliklerle uyumsuz hale gelebilir. Bir sınıfın yeni bir özelliği veya değiştirilmiş bir davranışı olduğunda, serileştirilmiş nesnelerin geri deserializasyonu sorunlara yol açabilir.
Bu yazımızda yeni sistemlerde artık kullanılmasına gerek olmayan “Java’da Serialization(serileştirme)” konusuna değindik. Her ne kadar artık JSON, XML gibi teknolojileri kullansakta geçmişini bilmeyen geleceğini bilemez felsefesinden yola çıkarak bu teknolojiyide bilmekte yarar var.