12 Ocak 2015 Pazartesi

Serialization/Serileştirme

                Bugünkü konumuz serizilation yani serileştirme olacak. Peki nedir serileştirme diye kısaca söyleyecek olursak bir andaki durumu kaydetme , daha sonra da kayıtlı olan durumu çekme işlemine diyoruz. Serileştirme özellikle network ve persistance işlemlerinde sıkça kullanılır. Serileştirmeyi kullanabilmemiz için implements Serializable . yazmamız gerek. Buradan anlayacağımıza göre serileştirme interface/ara birimdir. Şimdi konuyu daha iyi anlayabilmek için kod üzerinden devam edelim.

class Dog implements Serializable {
                String name = "Karabas";
}

public class SerializeDog {
public static void main(String[] args)
 throws IOException, ClassNotFoundException {
    Dog dog = new Dog();//dog objesi oluşturuyoruz

    FileOutputStream fos = new FileOutputStream("dog.serial");
    //dog.serial diye kaydediyoruz,farklı bir şey de olabilir
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(dog);//oluşturduğumuz objeyi kaydediyoruz
    oos.flush();//bufferden bağımsız kaydeder
    oos.close();//açık olanı kapatmak zorundayız
                              
    FileInputStream fis = new FileInputStream("dog.serial");
    //şimdi okuma işlemini yapıyoruz
    ObjectInputStream ois = new ObjectInputStream(fis);                         
    Dog deserializedDog = (Dog)ois.readObject();
    //veri kaybı olmaması için cast yapıyoruz
    System.out.println(deserializedDog.name);//ekrana yaz
    ois.close();//açılan dosyayı kapat
                              
                }
}

Peki tüm değişkenleri serileştirmek zorunda mıyız diye bir soru akla gelebilir. Tam da bu nokta transient keywordu karşımıza çıkar. Serileştirmek istemediğimiz değişkenin başına yazıyoruz. Mesela yukarıdaki örneğimizde eğer transient String … yapsaydık çıktımız null olacaktı. Şimdi de son bir örnek verip , o örnekler üzerinde farklı işlemler yaparak nasıl farklı çıktıları aldığımızı incelemeye çalışacağız. Bu açıdan konunun daha iyi pekişeceğini inanıyorum. Çünkü neden bu böyle olmuş , böyle olursa ne olur gibi sorularının cevabını da bulmuş olacağımıza inanıyorum. Şimdi kodumuzu yazalım

class Animal { //serileştirme işlemi yapılsa çıktı değişir
int height = 30;
        //String name="akbas";*
}

public class Dog extends Animal implements Serializable {
String name;//* bu kodu silmezsek yukarıdaki name değişkeni pasif kalır

public Dog(int height, String name) {
this.height = height;// bu satırları silerken 
this.name = name; // çıktımız 30 akbas olur !!
}

public static void main(String[] args) throws IOException, ClassNotFoundException {
    FileOutputStream fos = new FileOutputStream("dog.ser");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    Dog dog = new Dog(50, "karabas");
    System.out.println(dog.height + " " + dog.name);
    oos.writeObject(dog);
    oos.close();

    FileInputStream fis = new FileInputStream("dog.ser");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Dog deserializedDog = (Dog) ois.readObject();
    System.out.println(deserializedDog.height + " " + deserializedDog.name);
    ois.close();
}

}
  Çıktı:
50 karabas
30 karabas

    Burada çıktımız yukarıdaki gibi oldu. Fakat niye böyle oldusunu irdeleyelim isterseniz. Çünkü deserializetion işlemi sırasında yapılandırıcılar ve değişkenlere değer atanamıyor. Bu nedenle çıktımız böyle oldu. Dikkat edin Animal sınıfımıza serileştirme işlemi yapılmamış , eğer ona da serileştirme işlemi yaparsak bu sefer çıktımız değişecektir. Farklı satırlara bazı bilgiler ekledik. Sizler de aklınıza takılan soruları kodu değiştirerek daha iyi anlayabilirsiniz. Kolay gelsin

Kaynak
http://www.injavawetrust.com/pure-java-60-file-and-io-05-serialization/


Hiç yorum yok:

Yorum Gönder