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