Friday, July 31, 2009

serialVersionUID

Java Serilestirme mekanizmasi bir Java objesini alip onu bir byte[] dizisine cevirebilememizi sagliyor. Bu bayt serisini alip dosyaya yazabiliyor, network uzerinden gonderebiliyor, database'e yazabiliyoruz. Hatta Schemafree ile yaptigimiz zaten tami tamina bu aslinda; herhangi bir objeyi alip, serilestirip onu bir kimlik ile bagdastirarak o bayt serisini SFEntitiy kap objesi icine gomulmus bir sekilde veri tabanina yaziyoruz (bu class 'Serializable' arayuzunu implement ediyor olmali tabii ki).

Yanliz eger ek bazi tanimlar yapilmazsa, serilestirme ve deserilestirme islemleri, objemizin class tanimi degistiginde hata verir. Ornek: Class A icinde iki tane alan tanimladik. Bu sekilde veri tabanina yazdik. Sonra ek bir alan koymamiz gerekti, bunu yaptik, yeni kodu derledik, ama sonra hala eski tanimda olan bir onceki objeyi geri okumaya kaltik, ve hata mesaji gorduk. Niye? Cunku baytkod tanimlari artik birbiri ile uyusmuyordu.

Aslinda Java Serilestirme kutuphanesi "hala birbirine uyan" yani "okuyabilecegi kadarina okuyabilecek" "eski" alanlari cevirebilecek mekanizmalara sahiptir. Ama bu ozelligi kullanmak icin bean class icinde serialVersionUID diye bir oge tanimlamiz gerekli. Tanim soyle:
static final long serialVersionUID = [SAYI];
[SAYI] ile taninlanmis rakam nereden gelecek? Bu rakami JDK araclarinden serialver adli program uretebilir.
serialver -classpath [CLASSPATH] [paket.Class]
komutu ile gerekli sayiyi urettirmek mumkundur. Hatta bazi editorler bu rakami otomatik olarak Java kodunun icine koyabilirler. Bu rakamin onemi surada: Eger rakam degismemis ve objenizin onceki hali ile mevcut tanimi birbirine uyumlu (compatible) ise, Java Serilestirme kutuphanesi okuyabilecegi kadar alani okumaya ugrasir, ve bu okuma basari ile isler. Uyumlu olmak ne demek? Eski alanlarin taniminda "degisiklik yapilmamis" sadece yeni alanlar "eklenmis" demek. O zaman onceki ve sonraki class tanimlari birbiri ile uyumludur ve okuma islemi basari ile isleyecektir.

Gelistirme sirasinda eger class iceriginiz cok fazla degistiyse, ve uzerinde calistiginiz kod sonuc ortaminda kullanilmiyorsa, serialVersionUID'yi (tekrar) uretmek akillica olabilir. Ozellikle inner class iceren cok fazla bazi degisiklik sonrasi class'imizin uyumsuz hale geldigini bir kez gozlemledik ve problemi yeni ID ureterek tamir ettik.

1 comment:

Anonymous said...

Selam,

Burak bey,blogunuzu takip ediyorum. Serialization üzerine yazınıza geç rastladım.Java Serialization üzerine bir çalışma hazırlamıştım:

http://an0nym0us-blog.blogspot.com/2009/10/java-serialization.html