Burak IŞIKLI :))

Serialization(Serileştirme)

Posted in Java by Burak IŞIKLI on 17 Haziran 2009

Bir nesne herhangi stream’a (örneğin bir file’a ) yazılabilir ve bir stream’den okunabilir. Programın çalışması esnasında hafızada bulunan nesneler program bitince (kapatılınca) yok olur. Ancak serialization tekniğiyle bir nesne diske veya herhangi bir yere kaydedilebilir. Bir program, kapanmadan önce bir dosyayaya sakladığı bir nesneyi daha sonra tekrar çalıştırıldığında dosyadan okuyabilir. Hatta bir programın yazdığı nesneyi aynı dosyadan başka bir program da okuyabilir. Bu şekilde nesnelerin network’te bir yerden diğerine gönderilmesi, veritabanına normal bir veri gibi kaydedilebilmesi mümkün olabilmektedir.

Serializable

Bir class’ın serialization’a tabi tutulabilmesi için bazı koşulları sağlaması gerekir.

1. Class public olmalı.

2. Serializable’ interface’ini implement etmeli. Bu interface’de implement edilecek herhangi bir method yoktur. Sadece class’ın serialize edilebilemesine class yazarının izin verdiği anlamına gelir. Bazı classlar güvenlik v.s. nedenlerle buna izin vermek istemeyebilir. Nesnenin içerisindeki bütün veri serializable olmalıdır. Bir tane bile serializable olmayan nesne varsa işlem başarısız olur.

3. Default (parametresiz) bir constructor’ı olmalıdır. Hiç bir constructor yazılmaması durumunda da default contructor’un geçerli olduğu için yine sorun olmaz.

Öncelikle yaratacağımız objeyi  Serializable yapmalıyız. Bunun için  Serializable implement etmeliyiz.

PersistentTime.java


package edu.burakkk.sun;

import java.io.Serializable;
import java.util.Date;
import java.util.Calendar;

public class PersistentTime implements Serializable {
 static final long serialVersionUID = 10275539472837495L;
 private Date time;

 public PersistentTime() {
 time = Calendar.getInstance().getTime();
 }

 public Date getTime() {
 return time;
 }
}

FlattenTime.java


package edu.burakkk.sun;

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FlattenTime {
public static void main(String[] args) {
String filename = "time.ser";
if (args.length > 0) {
filename = args[0];
}
PersistentTime time = new PersistentTime();
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream(filename);
out = new ObjectOutputStream(fos);
out.writeObject(time);
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

InflateTime.java


package edu.burakkk.sun;

import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Calendar;

public class InflateTime {
public static void main(String[] args) {
String filename = "time.ser";
if (args.length > 0) {
filename = args[0];
}
PersistentTime time = null;
FileInputStream fis = null;
ObjectInputStream in = null;
try {
fis = new FileInputStream(filename);
in = new ObjectInputStream(fis);
time = (PersistentTime) in.readObject();
in.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
// print out restored time
System.out.println("Flattened time: " + time.getTime());
System.out.println();
// print out the current time
System.out.println("Current time: " + Calendar.getInstance().getTime());
}
}

Bu programda FlattenTime execute ettiğimizde o andaki saati objeye alarak time.ser adıyla kaydediyor. Daha sonra InflateTime sınıfıyla da bu kaydedilmiş objeyi okuyabiliriz. Aynı zamanda programı derlerken argüman olarak dosya adını verdiğimiz takdirde obje verdiğimizle adla kaydedilip okunacaktır. Dikkati çeken diğer bir konu static final long serialVersionUID = 10275539472837495L kod satırıdır. Aslında bu serilize ettiğimiz objeyi daha sonra tanımlada kullanabileceğimiz bir anahtar değerdir.  Fakat olması şart değildir. ObjectOutputStream veya ObjectInputStream ile obje dosyasını yazma ve okumayı sağlıyoruz. Serialization özellikle network(ağ) programlamada çok kullanılan bir özelliktir.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: