Java Serialization Nedir?

Osman Doğan
3 min readDec 28, 2022
Java Serialization

Java ile yazdığımız kodlar, data türleri ile birlikte, binary koda çevrilir. Bu kodlar arasında her değerin hangi data türüne sahip olduğu gibi bilgiler yer alır. Fakat oluşturduğumuz verileri Java dışına, örneğin hard disk gibi bir ortama aktardığımızda yalnızca verilerin aktarılmış olmasını sağlarız. Yani hangi verinin hangi data türüne sahip olduğu gibi bilgiler karşı tarafa gitmez. Bu sebeple bu verileri Java ortamına geri çağırdığımızda, sistem hangi verinin hangi veri türüne sahip olduğunu bilemez ve bu yüzden onları çalıştıramaz.

Bu problemin önüne geçmek için, veriler dışarıya aktarılırken, onların hangi türde olduklarını da beraberinde gönderen bir yapı oluşturulmuştur. Bu yapı Serialization yapısıdır. Serialization ile birlikte örneğin 5 sayısını dışarı aktardığınızda, yanında bu değerin Integer veri tibine sahip olduğu bilgisi de gider.

Serialization işlemi ile bu verilerin geri çağırılması ve Java diline uygun bir yapıya çevirilmesi işlemine ise Deserialization işlemi denir. Bu işlem, hangi verinin hangi data türüne sahip olduğunu tespit eder ve bu sayede onları yeniden Java diline yani Java’nın kullanabileceği hale getirir.

  • Örneğin User isimli bir pojo class oluşturalım. Bu class, diğer tüm pojo class’larda olduğu gibi 4 unsura sahip olacak. Bunlar;
  • Private Field’lar (Variable’lar)
  • Constructor
  • Getter ve Setter Metodlar (Encapsulation)
  • toString Metodunun Override Edilmesi

Ardından bu class’tan 3 farklı obje oluşturalım ve bunları dışarıya, bir veri dosyasına Serialization yardımıyla aktaralım. Bu işlemi gerçekleştirebilmek için User class’ının Serializable inteface’ine implement edilmesi gerekiyor.

Ardından bu dosyadaki verileri geri çekelim. Gelen objeleri gerekli container’lara düzgün bir şekilde ekleyebilmek için cast işlemi yapalım.

class User implements Serializable {
// User sınıfını Serializable interface’ine implement ettik.
// Yani serializable kıldık.

// private fields
private Long id;
private String name;
private String tcKimlikNo;

//constructor
public User(Long id, String name, String tcKimlikNo) {
this.id = id;
this.name = name;
this.tcKimlikNo = tcKimlikNo;
}

// Getter-Setter

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getTcKimlikNo() {
return tcKimlikNo;
}

public void setTcKimlikNo(String tcKimlikNo) {
this.tcKimlikNo = tcKimlikNo;
}

// toString

@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", tcKimlikNo='" + tcKimlikNo + '\'' +
'}';
}
}

User objesi oluşturma ve bunları harici bir dosyaya aktarma (Serialization)

Aşağıda writeObject() ismi ile oluşturduğumuz metot içerisinde üç adet yeni User objesi oluşturduk. Ve bunları user.dat isimli harici bir dosyaya aktardık.

// Serialization
private static void writeObjects() {
System.out.println("User Objeleri oluşturuluyor");
User user1 = new User(1L, "Yunus", "4587985644");
User user2 = new User(2L, "Yusuf", "4514585644");
User user3 = new User(3L, "Hakan”, "5247985644“);

try {
FileOutputStream fos = new FileOutputStream("user.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(user1);
oos.writeObject(user2);
oos.writeObject(user3);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

Verileri oluşturulan dosyadan geri alma ve uygun container’lara ekleme (Deserialization)

Oluşturduğumuz readObjects() isimli metot yardımı ile user.dat dosyasındaki verileri deserialization işlemine tabi tutalım ve bunları bu dosyadan geri okuyalım ve uygun container’lara ekleyelim.

// Deserialization
private static void readObjects() {

try {
FileInputStream fis = new FileInputStream("user.dat"); // okunacak dosyayı belirledik
ObjectInputStream ois = new ObjectInputStream(fis); // Obje olarak okunacağını bildirdik.
User user1 = (User) ois.readObject(); // Uygun container'lara ekleme
User user2 = (User) ois.readObject();
User user3 = (User) ois.readObject();

System.out.println(user1); // ekrana yazdırma
System.out.println(user2);
System.out.println(user3);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}

Main metod içerisinde metodların çağırılması

public static void main(String[] args) {
writeObjects();
readObjects();

}

Serialization ile ilgili bazı notlar

  • Serializable interface’ine implements edilen class’ların child class’ları da serialization işlemine hazır olur.
  • Static field’lar serialize edilemezler. Çünkü onlar bir objeye değil, class’a aittirler.
  • transient olarak tanımlanan field’lar, serialize işlemine tabi tutulmazlar, sistem bu field’ları es geçer. Null şeklinde kalırlar.
public class User implements Serializable {
public String name;
transient public String password;

--

--