1~

Minter Coder's Blog

EK - Java da Serialization ve Deserialization / transient modifier

2021-07-03

Java da Serialization , bir nesnesinin durumunu bir byte-stream içerisine yazma durumudur.Başlıca Hibernate,RMI,JPA,EJB ve JMS teknolojilerinde kullanılır.Serialization işleminin tersi deserialization olarak adlandırılır , burda byte-stream objeye tekrardan dönüştürülür.Serialization ve deserialization işlemleri platform bağımsızdır , yani siz bir objeyi herhangi bir platformda serialize edebilirsiniz ve başka bir platformda da deserialize edebilirsiniz.

 

Bir nesneyi serialize etmek için ObjectOuputStream classının writeObject() methodunu çağırıyoruz.Deserialize etmek için ise ObjectInputStream classının readObject() methodunu kullanıyoruz.Tabi ki objeyi serialization için Serializable interfacesini implement etmek zorundayız.

 

java.io.Serializable interface

Serializable bir marker interfacesidir(data member ve methoda sahip değildir).

Hangi nesneyi persist etmek istiyorsanız onun classı tarafından implement edilmek zorundadır.

Aşağıda çok güzel bi örnek ile açıklanmıştır.Yorumları ve kodları dikkatlice okuyunuz.

import java.io.*;
// Object classımızı oluşturdum
public class Student implements Serializable {
    int id;
    String name;
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
// Burada nesnemizi persist ediyoruz f.txt adlı bir dosyaya
class Persist{
    public static void main(String[] args) {
        Student s = new Student(1,"Kerem");
        try {
            // dosyaya byte-based veri akışını açıyorum
            FileOutputStream stream = new FileOutputStream("f.txt");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(stream);
            // nesnemizi f.txt dosyasına yazıyoruz
            objectOutputStream.writeObject(s);
            // stream yolunu temizliyorum , kısacası sifonu çekiyorum
            objectOutputStream.flush();
            // streamı kapatıyorum
            objectOutputStream.close();
            System.out.println("Ok");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// Aşağıda da yukarıdaki olayların tam tersini yapıyorum.
class Depersist{
    public static void main(String[] args) {
        try{
            FileInputStream fileInputStream = new FileInputStream("f.txt");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            Student s1 = (Student) objectInputStream.readObject();
            System.out.println(s1.id+" "+s1.name);
        }catch(IOException e){
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

 

Persist yapıldığında çıktı :

Ok

Depersist yapıldığında çıktı:

1 Kerem

 

 

 

transient keywordü

Eğer ki bir objede classın herhangi bir data memberini serialize etmek istemiyorsanız bu keywordü kullanabilirsiniz.Yukarıdaki örnekte id kısmını transient yapıyorum ve Depersist yapıldığındaki çıktıya dikkat edin lütfen.

 

 

import java.io.*;
// Object classımızı oluşturdum
public class Student implements Serializable {
    transient int id;
    String name;
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
// Burada nesnemizi persist ediyoruz f.txt adlı bir dosyaya
class Persist{
    public static void main(String[] args) {
        Student s = new Student(1,"Kerem");
        try {
            // dosyaya byte-based veri akışını açıyorum
            FileOutputStream stream = new FileOutputStream("f.txt");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(stream);
            // nesnemizi f.txt dosyasına yazıyoruz
            objectOutputStream.writeObject(s);
            // stream yolunu temizliyorum , kısacası sifonu çekiyorum
            objectOutputStream.flush();
            // streamı kapatıyorum
            objectOutputStream.close();
            System.out.println("Ok");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// Aşağıda da yukarıdaki olayların tam tersini yapıyorum.
class Depersist{
    public static void main(String[] args) {
        try{
            FileInputStream fileInputStream = new FileInputStream("f.txt");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            Student s1 = (Student) objectInputStream.readObject();
            System.out.println(s1.id+" "+s1.name);
        }catch(IOException e){
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

 

Persist de çıktı :

OK

Depersist de çıktı:

0 Kerem