Serialization, ObjectInputStream

Kategori: Java , 18 Temmuz 2019 , JanFranco


Bir önceki yazımızda ObjectOutputStream sınıfı ve Serializable Interfacesini kullanarak bir sınıftan yarattığımız objeleri diske kaydetmiştik. Kaydettiğimiz dosyayı deserialization ile memorye yazıp okuyacağız. Student sınıfında herhangi bir değişiklik yapmadığımız için tekrar yazmıyorum. Main_class'tan dosyaya erişelim ve okuyalım:


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Main_class {
	
	public static void main(String[] args){
		
		try(ObjectInputStream input = new ObjectInputStream(new FileInputStream("C:\\Users\\ErenS\\Desktop\\student.bin"))){
			
			Student s1 = (Student)input.readObject();
			Student s2 = (Student)input.readObject();
			
			System.out.println(s1);
			System.out.println(s2);
			
		} catch (FileNotFoundException e) {
			System.out.println("File not found.");
		} catch (IOException e) {
			System.out.println("IOException. Please check the version.");
		} catch (ClassNotFoundException e) {
			System.out.println("Class not found.");
		}
		
	}
	
}
İki obje okuyacağımızdan iki adet obje üretiyoruz. Referans olarak input.readObject(); methodunu yazıyoruz. Ancak Java hangi sınıfı okuduğumuzu bilmediğinden parantez içinde belirtiyoruz, tür dönüşümü yapmış oluyoruz. Burada Java bize bir hata verir. ClassNotFoundException hatasını yakalamamızı ister. ClassNotFoundException hatasını da catch bloğuna ekledikten sonra çalıştıralım:

Student [name=Jan Franco, department=Computer Science, studentNo=1111]
Student [name=Jane Franco, department=Dentistry, studentNo=9999]
Başarılı bir şekilde çalıştı. Biz objeleri 1000 sürümüyle kaydetmiştik. Şimdi Student sınıfındaki sürümü 2000 yapalım ve IOException yakaladığımız catch bloğu biraz değiştirelim:

catch (IOException e) {
    e.printStackTrace();
}
Aldığımız hata:

java.io.InvalidClassException: Student; local class incompatible: stream classdesc serialVersionUID = 1000, local class serialVersionUID = 2000
	at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at Main_class.main(Main_class.java:12)


Sonraki Yazı: Serialization, Arrays and Collections
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın