Serileşme, bir nesneyi bayt akışına dönüştürme mekanizmasıdır, bu sayede nesne depolanabilir veya iletilebilir. Java'da serileşme, dağıtık uygulamaların popülaritesi ve aralarındaki veri alışverişi gereksinimleri nedeniyle 1.1 sürümü ile platform ile birlikte API'nin bir parçası olarak ortaya çıkmıştır. Bu çözüm, JVM'ler arasında karmaşık nesne grafikleri ile ilgili veri aktarımını kolaylaştırarak, geliştiricinin süreci şeffaf bir hale getirmesini sağlamıştır.
Serileşme sorunu, verilerin bütünlüğünü sağlamak, sınıfların sürümlemesini desteklemek ve karmaşık yapıları (örneğin, döngüsel referanslar içeren grafikler) doğru bir şekilde işlemek gerekliliğidir. Tüm nesneler serileştirilebilir değildir (örneğin, akışlar, soketler, OS kaynakları) ve serileşme güvenliğe dikkat edilmesini gerektirmektedir.
Çözüm, Serializable arayüzü aracılığıyla gerçekleştirilmiştir:
import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private transient int age; // serileştirilmez public Person(String name, int age) { this.name = name; this.age = age; } }
ObjectOutputStream ve ObjectInputStream kullanarak nesne bir dosyaya yazılabilir ve geri alınabilir:
Person p = new Person("Alice", 30); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser")); oos.writeObject(p); // serileştirme ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); Person restored = (Person) ois.readObject();
Anahtar özellikler:
Serializable arayüzünü uygulaması gerekmektedir.transient anahtar kelimesi ile işaretlenmiş alanlar serileştirilmez.Kullanılmasa bile, serileştirilemeyen bir alana sahip bir nesneyi serileştirebilir miyiz?
Cevap: Eğer alan transient olarak işaretlenmişse, tamamen serileştirilmez ve sürecin istisna ile sonuçlanması söz konusu olmaz, alanın tipi Serializable'ı uygulamasa bile. Eğer alan serileştirilemez ve transient değilse, NotSerializableException istisnası fırlatılır.
Eğer sınıf Serializable'ı uyguluyorsa, statik bir alan serileştirilebilir mi?
Cevap: Hayır, statik alanlar serileştirilemez çünkü bunlar sınıfa ait olup, örneğe ait olan durumu korur. Sadece örneğin durumu kaydedilir.
Eğer serileştirme işleminden sonra sınıfın yapısını değiştirirsek (örneğin, bir alan ekler veya kaldırırsak) ne olur?
Cevap: Eğer serialVersionUID'yi belirtiyorsanız ve yapı uyumsuz bir şekilde değiştiyse, deseralizasyon sırasında InvalidClassException hatası alınır. Uyum sağlamak için serileştirme ipuçları ve serialVersionUID’nin manuel yönetimi kullanılmaktadır.
Mühendisler, serialVersionUID'yi eklemeden ve OS kaynaklarına referans veren alanları transient olarak belirtmeden bir nesneyi serileştirmeye karar verdiler. Uygulama ve sınıf güncellendikten sonra InvalidClassException hatası meydana geldi ve nesne bütünlüğünü kaybetti, deseralizasyon çalışmamaya başladı.
Avantajlar:
Dezavantajlar:
Serileştirme için, açık bir serialVersionUID ile taşınabilir bir sınıf oluşturulmuş, tüm kaynak alanları transient olarak bildirilmiş ve manuel serileştirme anahtar noktalarda kontrol edilmiştir.
Avantajlar:
Dezavantajlar: