Bu Blogda Ara

18 Eylül 2010 Cumartesi

Java ile Nesneleri Dosyaya Kaydetme ve Okuma (Serialization)

Nesne yönelimli programlamada bellekte yüklü nesnelerin dosyaya kaydedilmesi ve tekrar dosyadan okunarak belleğe yüklenmesi olayına Serialization (Serileştirme olarak tercüme edilebilir) denmektedir.


Örneğimize geçmeden önce bu yöntem ile neler yapabileceğimizi değerlendirelim. Geliştirdiğimiz programlarda tüm işlemleri nesneler üzerinden gerçekleştiririz. Bazı durumlarda uygulamamızda kullanacağımız bilgileri bir dosya üzerinde saklamak isteyebiliriz. Bu noktada aklımıza veritabanı sistemleri gelebilir, fakat burada bahsettiğimiz veriler programın mantıksal verileri olduğu için genelde büyük boyutta olmazlar. Aynı zamanda nesnelerimizi veritabanında da tutabiliriz. Unutmamız gereken nokta Serialization dediğimiz olay nesnelerin hafızadaki yapısını ikili (binary) olarak saklamaktır. Neler yapılabilir sorusuna çok çeşitli cevaplar veribilir benim aklıma gelen şu başlıklar:
- Uygulamanın ayarlarının kaydedilmesi
- Basit bir veritabanı olarak kullanılması
- Programın çökmesi durumunda en son tutarlı yerden devam etmesi için hafızanın kaydedilmesi...

Normalde düşündüğümüz zaman bir nesneyi diskte saklamak çok külfetli bir iştir. Nesnenin tüm bilgilerini tek tek toplayıp bir sıraya koyacaksınız, ardından bunları karıştırmadan ve atlamadan (null değişkenler olabilir, ya da String benzeri dinamik genişleyen generic yapılar olabilir) doğru bir şekilde yazmalısınız. Okuma olayına hiç girmiyorum zaten. Ayrıca her nesnenin iç yapısı farklı olacaktır!

Peki hafızadan direk BYTE dizisi olarak diske yazmak? Java dilinde hafızaya direk erişimimiz olmadığı (işaretçilerin olamaması) için normal şartlar altında mümkün olmaması lazım. Fakat Java bize bu işlemi çok kolay bir şekilde yapacak bir imkan sağlamaktadır.

Java'da yazılan tüm nesneler Serializable arayüzünden (interface) kalıtım aldığı sürece sorunsuz bir şekilde diske yazılabilmektedir. Aynı rahatlıkla diskten okunabilmektedir. Bunun için özel olarak hazırlanmış yazan ve okuyan sınıfları kullanmaktadır.

Lafı fazla dolandırmadan örneğimize geçelim. Yorum satırlarını yeterli gördüğüm için tekrardan açıklama gereği duymadım.



/*
* Öğrenci Sınıfı
* Ogrenci.java
*/

package rbellek.blogspot.com;

import java.io.Serializable;

/**
*
* @author Ramazan
*/
public class Ogrenci implements Serializable {

private String isim;

public String getIsim() {
return isim;
}

public void setIsim(String isim) {
this.isim = isim;
}
}


/*
* Serilazation Örnek
* Main.java
*/
package rbellek.blogspot.com;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author Ramazan
*/
public class Main {

public static void main(String[] args) {
Ogrenci o1 = new Ogrenci(); // Yeni bir öğrenci nesnesi oluşturalım.
o1.setIsim("Ahmet"); // İsmini verelim.
System.out.println(o1.getIsim()); // Test edelim.
try {
// Nesneyi dosyaya kaydedelim.
FileOutputStream yazmac = new FileOutputStream("Ogrenci1.nesne"); // Dosyaya veri aktarım akışı nesnesi oluşturalım.
ObjectOutputStream nesneYazmac = new ObjectOutputStream(yazmac); // Nesneleri veri akışlarına yazmaya yarayan nesneyi oluşturalım.
nesneYazmac.writeObject(o1); // Öğrenci nesnemizi dosyaya yazıyoruz.
nesneYazmac.close(); // akışı kapatalım.
} catch (FileNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

o1.setIsim("Mehmet"); // Öğrenci nesnemizin adını değiştirelim.
System.out.println(o1.getIsim()); // Test edelim.

Ogrenci o2 = null; // Başka bir öğrenci nesnesi referansı. (Henüz bir nesne oluşturmadık!)

try {
FileInputStream okuyucu = new FileInputStream("Ogrenci1.nesne"); // Dosyadan veri alan akış nesnesi.
ObjectInputStream nesneOkuyucu = new ObjectInputStream(okuyucu); // Dosyada kayıtlı nesneleri okuyan nesne.
o2 = (Ogrenci) nesneOkuyucu.readObject(); // Öğrenci nesnemizi okuyalım.
nesneOkuyucu.close(); // akışı kapatalım.
} catch (FileNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

System.out.println(o2.getIsim()); // Okunan nesne adı Ahmet olmalı...
}
}



İyi çalışmalar...

Hiç yorum yok: