Object Serialization(Nesneleri Serileştirme) kullanarak nesneler byte dizisi haline getirilebilir bu sayede nesneler program kapatıldığında dahi kalıcı olmuş olacaklardır.
Serileştirilmiş nesnelerin tekrar belleğe yüklenmesi için de Object Deserialization kullanılır. Deserialization işleminden sonra nesneler kullanılabilir halde olurlar.
Bu 2 işlem için gerekli olanlar :
-
Serializable Arayüzü(Interface) –> Bu arayüzü sağlayan(implements) sınıflar serileştirilebilir olduğunu söylemektedir.
-
ObjectOutputStream,FileOutputStream –> Bu sınıflar bir nesnenin serialization işleminde kullanılır. Nesnenin nereye yazılacağının bilgisini FileOutputStream ile belirlenir. ObjectOutputStream ise FileOutputStream sınıfının örneğini kullanarak nesneyi yazar.
-
ObjectInputStream,FileInputStream –> Bu sınıflar bir nesnenin deserialization işleminde kullanılır. Nesnenin nereden okunacağının bilgisini FileInputStream ile belirlenir. ObjectInputStream ise FileInputStream sınıfının örneğini kullanarak nesneyi okur.
Kullanılan Sınıflar :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.saidaydogan; public class Insan implements java.io.Serializable { private static final long serialVersionUID = 1L; private String ad, tc; public Insan(String ad, String tc) { this.ad = ad; this.tc = tc; } public String getAd() { return ad; } public void setAd(String ad) { this.ad = ad; } public String getTc() { return tc; } public void setTc(String tc) { this.tc = tc; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.saidaydogan; public class Calisan extends Insan { private static final long serialVersionUID = 1L; private int maas; public Calisan(String ad,String tc,int maas) { super(ad,tc); this.setMaas(maas); } public int getMaas() { return maas; } public void setMaas(int maas) { this.maas = maas; } } |
-
Yukarda tanımlanan Calisan sınıfı görüldüğü üzere Insan sınıfından türetilmiş ve Serializable olarak işaretlenmiştir. Burda önemli olan nokta Serializable arayüzünü gerçeklemiş olmasıdır. Buna ek olarak eğer bir sınıfın üst sınıfı Serializable arayüzünü gerçeklemişse ondan türetilen sınıflar da Serializable işlemine tâbi olabilirler.
-
serialVersionUID, yazdırılan nesnelerin versiyon kontrolünü sağlamak için kullanılır.Eklenmediği durumda Eclipse uyarı verir. “@SupressWarning(Serial)” ile derleyici bilgilendirilirse uyarı mesajı vermez.
Serileştirme İşlemi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package com.saidaydogan; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class Test { public static void main(String[] args) { System.out.println("Test Başlatıldı.."); Serilestir(); } public static void Serilestir() { try { // ObjectOutpuStream sınıfı java.io.ObjectOutput arayüzünü gerçekleyen bir nesneyle kurulabilir. ObjectOutputStream writer = new ObjectOutputStream( new FileOutputStream("test.data")); // test.data dosyası proje klasöründe oluşacaktır. çünkü tam yol belirtilmedi. writer.writeObject(10); // Calışan sayısı yazdırılıyor ki okurken bu bilgi lazım olacak. System.out.println("10 çalışanın Bilgileri Şu Şekilde"); Calisan calisan; for (int i = 0; i < 10; i++) { // 10 tane çalışan üretiliyor ve test.data ya yazdırılıyor. calisan = new Calisan(Integer.toString(i), Integer.toString(i),i); System.out.println("Ad : " + i + " TC : " + i + " Maaş : " +i); writer.writeObject(calisan); } writer.close(); // Yazma işlemi kapatılmaldır. System.out.println("Serileştirme Testi Başarılı.\ntest.data oluşturuldu."); } catch (IOException e) { // ObjectOutputStream checked exception (IOException) olduğu için try-catch yapısı kullanılmalıdır. e.printStackTrace(); // Hatanın nerde olduğuna dair bilgiyi konsola yazar. } } } |
Konsol Çıktısı :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Test Başlatıldı.. 10 çalışanın Bilgileri Şu Şekilde Ad : 0 TC : 0 Maaş : 0 Ad : 1 TC : 1 Maaş : 1 Ad : 2 TC : 2 Maaş : 2 Ad : 3 TC : 3 Maaş : 3 Ad : 4 TC : 4 Maaş : 4 Ad : 5 TC : 5 Maaş : 5 Ad : 6 TC : 6 Maaş : 6 Ad : 7 TC : 7 Maaş : 7 Ad : 8 TC : 8 Maaş : 8 Ad : 9 TC : 9 Maaş : 9 Serileştirme Testi Başarılı. test.data oluşturuldu. |
-
Bu örnekte ObjectOutputStream sınıfının WriteObject metodu kullanılarak nesneler teker teker yazdırıldı. Duruma göre daha farklı şekilde de yazdırılabilirdi (Örneğin bir List’i direkt olarak WriteObject e parametre olarak vermek gibi.).
- ObjectOutputStream sınıfının WriteInt(int) vs gibi de metodları bulunmakta gerektiğinde kullanılmalıdır.
- Bir başka konu ise “transient” anahtar kelimesidir. Bu anahtar kelimeyle birlikte kullanılan üye alanlar serileştirilmez.
Dosyadan Okuma İşlemi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public static void dosyadanOku() { try { // ObjectOutpuStream sınıfı java.io.ObjectInpput arayüzünü // gerçekleyen bir nesneyle kurulabilir. ObjectInputStream reader = new ObjectInputStream( new FileInputStream("test.data")); // test.data dosyası // proje klasöründen // okunacaktır. çünkü // tam yol belirtilmedi. int calisanSayisi = (int) reader.readObject(); // Calışan sayısı // okunuyor. System.out.println(calisanSayisi + " çalışanın Bilgileri Şu Şekilde"); Calisan[] calisanlar = new Calisan[calisanSayisi]; // Calisan Sayısı // kullanarak // calisanların // bir diziye // alınması // sağlanacak. for (int i = 0; i < calisanSayisi; i++) { // Calisan sayisi kadar // çalışan test.data'dan // okunuyor. calisanlar[i] = (Calisan) reader.readObject(); // Okunan ve artık kullanılabilir nesne olan calisanın bilgileri // yazdırılıyor. System.out.println("Ad : " + calisanlar[i].getAd() + " TC : " + calisanlar[i].getTc() + " Maaş : " + calisanlar[i].getMaas()); } reader.close(); System.out .println("Okuma Testi Başarılı.\ntest.data okunması tamamlandı."); } catch (IOException e) { // ObjectInputStream checked exception // (IOException) olduğu için try-catch // yapısı kullanılmalıdır. e.printStackTrace(); // Hatanın nerde olduğuna dair bilgiyi konsola // yazar. } catch (ClassNotFoundException e) { // Tip dönüşümü (Cast etme işlemi) // yapılırken sınıfı bulamazsa // bu exception fırlatılır. e.printStackTrace(); } } |
Konsol Çıktısı :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Test Başlatıldı.. 10 çalışanın Bilgileri Şu Şekilde Ad : 0 TC : 0 Maaş : 0 Ad : 1 TC : 1 Maaş : 1 Ad : 2 TC : 2 Maaş : 2 Ad : 3 TC : 3 Maaş : 3 Ad : 4 TC : 4 Maaş : 4 Ad : 5 TC : 5 Maaş : 5 Ad : 6 TC : 6 Maaş : 6 Ad : 7 TC : 7 Maaş : 7 Ad : 8 TC : 8 Maaş : 8 Ad : 9 TC : 9 Maaş : 9 Okuma Testi Başarılı. test.data okunması tamamlandı. |
- Okuma işlemlerinde dikkat edilmesi gereken nokta, okunan nesnenin serileştirilen nesne’nin tipine dönüştülmesi gerekebilir. Çünkü readObject() metodu object döndürmektedir cast(tip dönüşümü) işlemi ile rahatlıkla serileştirilmeden önce kullanılabilen üye alanlara ve metodlara da erişim sağlanır.