Java - Serileştirme

Java, bir nesnenin nesnenin verilerini ve nesnenin türü ve nesnede depolanan veri türleri hakkındaki bilgileri içeren bir bayt dizisi olarak temsil edilebildiği nesne serileştirme adı verilen bir mekanizma sağlar.

Serileştirilmiş nesne bir dosyaya yazıldıktan sonra, dosyadan okunabilir ve serileştirmesi kaldırılabilir, yani nesneyi temsil eden tür bilgileri ve baytlar ve verileri bellekte nesneyi yeniden oluşturmak için kullanılabilir.

En etkileyici olanı, tüm sürecin JVM'den bağımsız olması, yani bir nesnenin tek bir platformda serileştirilebilmesi ve tamamen farklı bir platformda serileştirilmesinin kaldırılmasıdır.

Sınıflar ObjectInputStream ve ObjectOutputStream Bir nesneyi serileştirme ve seriyi kaldırma yöntemlerini içeren üst düzey akışlardır.

ObjectOutputStream sınıfı, çeşitli veri türlerini yazmak için birçok yazma yöntemi içerir, ancak özellikle bir yöntem öne çıkar -

public final void writeObject(Object x) throws IOException

Yukarıdaki yöntem bir Nesneyi serileştirir ve onu çıktı akışına gönderir. Benzer şekilde, ObjectInputStream sınıfı, bir nesnenin serisini kaldırmak için aşağıdaki yöntemi içerir -

public final Object readObject() throws IOException, ClassNotFoundException

Bu yöntem, sonraki Nesneyi akıştan alır ve serisini kaldırır. Dönüş değeri Object olduğundan, onu uygun veri türüne dönüştürmeniz gerekir.

Java'da serileştirmenin nasıl çalıştığını göstermek için, kitabın başlarında tartıştığımız Employee sınıfını kullanacağım. Serileştirilebilir arabirimi uygulayan aşağıdaki Employee sınıfına sahip olduğumuzu varsayalım -

Misal

public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

Bir sınıfın başarılı bir şekilde serileştirilmesi için iki koşulun karşılanması gerektiğine dikkat edin -

  • Sınıf, java.io.Serializable arabirimini uygulamalıdır.

  • Sınıftaki tüm alanlar serileştirilebilir olmalıdır. Bir alan serileştirilebilir değilse, işaretlenmelidirtransient.

Bir Java Standart Sınıfının serileştirilebilir olup olmadığını merak ediyorsanız, sınıfın belgelerine bakın. Test basittir: Sınıf java.io.Serializable uyguluyorsa, o zaman serileştirilebilir; aksi halde değil.

Bir Nesneyi Seri Hale Getirme

ObjectOutputStream sınıfı, bir Object serileştirmek için kullanılır. Aşağıdaki SerializeDemo programı bir Employee nesnesini başlatır ve bir dosyaya serileştirir.

Programın çalıştırılması bittiğinde, worker.ser adlı bir dosya oluşturulur. Program herhangi bir çıktı üretmez, ancak kodu inceleyin ve programın ne yaptığını belirlemeye çalışın.

Note - Bir nesneyi bir dosyaya serileştirirken, Java'daki standart kural, dosyaya bir .ser uzantı.

Misal

import java.io.*;
public class SerializeDemo {

   public static void main(String [] args) {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      
      try {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      } catch (IOException i) {
         i.printStackTrace();
      }
   }
}

Bir Nesnenin Serisini Kaldırma

Aşağıdaki DeserializeDemo programı, SerializeDemo programında oluşturulan Employee nesnesinin serisini kaldırır. Programı inceleyin ve çıktısını belirlemeye çalışın -

Misal

import java.io.*;
public class DeserializeDemo {

   public static void main(String [] args) {
      Employee e = null;
      try {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      } catch (IOException i) {
         i.printStackTrace();
         return;
      } catch (ClassNotFoundException c) {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Dikkat edilmesi gereken önemli noktalar şunlardır:

  • Try / catch bloğu, readObject () yöntemi tarafından bildirilen bir ClassNotFoundException'ı yakalamaya çalışır. Bir JVM'nin bir nesnenin serisini kaldırabilmesi için, sınıfın bayt kodunu bulabilmesi gerekir. JVM, bir nesnenin serisini kaldırırken bir sınıf bulamazsa, bir ClassNotFoundException oluşturur.

  • ReadObject () işlevinin dönüş değerinin bir Çalışan referansına dönüştürüldüğüne dikkat edin.

  • Nesne serileştirildiğinde SSN alanının değeri 11122333 idi, ancak alan geçici olduğu için bu değer çıkış akışına gönderilmedi. Serileştirilmiş Employee nesnesinin SSN alanı 0'dır.