serialVersionUID Serileştirilmiş verilerin versiyonlanmasını kolaylaştırır. Serileştirme sırasında değeri verilerle birlikte kaydedilir. Serileştirme işleminde, serileştirilmiş verinin geçerli kodla nasıl eşleştiğini görmek için aynı sürüm denetlenir.
Verilerinizi sürümlendirmek istiyorsanız, normalde
serialVersionUID 0'dan başlayarak , seri hale getirilmiş verileri değiştiren (geçici olmayan alanlar ekleyerek veya kaldırarak) sınıfınızdaki her yapısal değişiklikle çarpın.
Yerleşik seri hale getirme mekanizması (
in.defaultReadObject() ), verilerin eski sürümlerinden serileştirilmeyi reddeder. Ancak isterseniz eski verileri okuyabilen kendi readObject () işlevini tanımlayabilirsiniz . Bu özel kod daha sonra
serialVersionUID verilerin hangi sürümde olduğunu bilmek ve verilerin nasıl seri hale getirileceğine karar vermek için kontrol edebilir. Bu sürüm oluşturma tekniği, kodunuzun birkaç sürümünde hayatta kalan serileştirilmiş verileri saklarsanız kullanışlıdır.
Ancak seri hale getirilmiş verileri bu kadar uzun bir süre boyunca saklamak çok yaygın değildir. Seri hale getirme mekanizmasını, örneğin bir önbelleğe geçici olarak veri yazmak veya ağ üzerinden kod tabanının ilgili bölümlerinin aynı sürümüne sahip başka bir programa göndermek için kullanmak çok daha yaygındır.
Bu durumda geriye dönük uyumluluk sağlamakla ilgilenmiyorsunuz. Yalnızca iletişimde bulunan kod tabanlarının, ilgili sınıfların aynı sürümlerine sahip olduğundan emin olmakla ilgileniyorsunuz. Böyle bir kontrolü kolaylaştırmak için,
serialVersionUID tıpkı eskisi gibi devam etmeli ve sınıflarınızda değişiklik yaparken güncellemeyi unutmamalısınız.
Alanı güncellemeyi unutursanız, farklı bir yapıya sahip ancak aynı olan bir sınıfın iki farklı sürümüyle karşılaşabilirsiniz
serialVersionUID . Bu olursa, varsayılan mekanizma (
in.defaultReadObject() ) herhangi bir fark algılamaz ve uyumsuz verileri seri hale getirmeye çalışır. Şimdi kriptik bir çalışma zamanı hatası veya sessiz hatayla (boş alanlar) bitebilir. Bu tür hataları bulmak zor olabilir.
Bu yüzden bu usecase'e yardım etmek için Java platformu size
serialVersionUID manuel olarak ayar yapmama seçeneği sunar . Bunun yerine, derleme zamanında sınıf yapısının bir karması üretilecek ve id olarak kullanılacaktır. Bu mekanizma, aynı kimliğe sahip farklı sınıf yapılarına sahip olmadığınızdan emin olacak ve bu nedenle, bu izlemesi zor çalışma zamanı serileştirme hatalarını yukarıda belirtmeyeceksiniz.
Ancak otomatik olarak oluşturulan kimlik stratejisinin arka tarafı vardır. Yani, aynı sınıf için üretilen kimlikleri derleyiciler arasında farklılık gösterebilir (yukarıda Jon Skeet tarafından belirtildiği gibi). Bu nedenle seri hale getirilmiş verileri farklı derleyicilerle derlenmiş kodlar arasında iletirseniz, kimlikleri yine de manuel olarak tutmanız önerilir.
Ayrıca, belirtilen ilk kullanım durumundaki gibi verilerinizle geriye dönük olarak uyumluysanız, muhtemelen kimliği de korumak istersiniz. Bu, okunabilir kimlikleri elde etmek ve ne zaman ve nasıl değiştikleri üzerinde daha fazla kontrole sahip olmak için.