serialVersionUID
serileştirilmiş verilerin sürümlendirilmesini kolaylaştırır. Serileştirilirken değeri verilerle birlikte kaydedilir. Serileştirmeyi kaldırırken, serileştirilmiş verilerin geçerli kodla nasıl eşleştiğini görmek için aynı sürüm kontrol edilir.
Verilerinizi sürümlendirmek istiyorsanız, normalde serialVersionUID
0 ile başlarsınız ve serileştirilmiş verileri değiştiren (geçici olmayan alanları ekleyerek veya kaldırarak) sınıfınızdaki her yapısal değişiklikle bu verileri vurursunuz.
Yerleşik serileştirme mekanizması ( in.defaultReadObject()
), verilerin eski sürümlerinden serileştirmeyi reddedecektir. Ancak isterseniz eski verileri okuyabilen kendi readObject () işlevinizi tanımlayabilirsiniz . Bu özel kod daha sonra serialVersionUID
verinin hangi sürümde olduğunu bilmek ve verilerin seri dışı bırakılmasına karar vermek için kontrol edebilir. Bu sürüm oluşturma tekniği, kodunuzun çeşitli sürümlerinden sağ çıkmış olan serileştirilmiş verileri depolarsanız yararlıdır.
Ancak bu kadar uzun bir süre için serileştirilmiş verilerin depolanması çok yaygın değildir. Ö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 veri göndermek için serileştirme mekanizmasını kullanmak çok daha yaygındır.
Bu durumda geriye dönük uyumluluğu korumakla ilgilenmezsiniz. Yalnızca iletişim kuran kod tabanlarının ilgili sınıfların aynı sürümlerine sahip olduğundan emin olmakla ilgilenirsiniz. Böyle bir kontrolü kolaylaştırmak için, serialVersionUID
tıpkı daha önce olduğu gibi devam etmeli ve sınıflarınızda değişiklik yaparken güncellemeyi unutmamalısınız.
Alanı güncellemeyi unutursanız, bir sınıfın farklı yapıya sahip ancak aynı olan iki farklı sürümü olabilir serialVersionUID
. Bu durumda, varsayılan mekanizma ( in.defaultReadObject()
) herhangi bir fark algılamaz ve uyumsuz verilerin serileştirilmesini kaldırmaya çalışır. Artık şifreli bir çalışma zamanı hatası veya sessiz hata (boş alanlar) ile sonuçlanabilir. Bu tür hataları bulmak zor olabilir.
Dolayısıyla, bu kullanıcı tabanına yardımcı olmak için Java platformu, serialVersionUID
manuel olarak ayarlamama seçeneği sunar . Bunun yerine, derleme zamanında sınıf yapısının bir karması oluşturulur ve id olarak kullanılır. Bu mekanizma, asla aynı kimliğe sahip farklı sınıf yapılarına sahip olmadığınızdan emin olur ve böylece yukarıda bahsedilen bu izlemesi zor çalışma zamanı serileştirme hatalarını alamazsınız.
Ancak otomatik olarak oluşturulan kimlik stratejisinin bir arka tarafı vardır. Yani aynı sınıf için oluşturulan kimlikler derleyiciler arasında farklılık gösterebilir (yukarıda Jon Skeet tarafından belirtildiği gibi). Bu nedenle, farklı derleyicilerle derlenen kod arasında serileştirilmiş veriler iletirseniz, kimlikleri yine de manuel olarak tutmanız önerilir.
Bahsedilen ilk kullanım durumunda olduğu gibi verilerinizle geriye dönük olarak uyumluysanız, muhtemelen kimliği kendiniz de korumak istersiniz. Bu, okunabilir kimlikleri almak ve ne zaman ve nasıl değiştikleri üzerinde daha fazla kontrole sahip olmak için.