IntelliJ IDEA üreten serialVersionUID


297

IntelliJ IDEA'da bu değer nasıl üretilir?

Ben gidip Ayarlar -> Hatalar -> Diziselleştirme sorunları - 'serialVersionUID' olmadan> Serializable sınıf, ama yine de bana uyarı göstermez. Sınıfım PKladrBuilding üst öğesi Serializable arabirimini uygular .

Kodun bir parçası:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
Kendinizinkini tanımlamak yerine bir değer üretmeniz gerektiğinden emin misiniz? Yeni bir sınıf oluşturuyorsanız 1L, serileştirilmiş formunuz değiştiğinde örneğin kimliğiniz ve artışınız olarak tanımlamanızı öneririm . (Bkz. Stackoverflow.com/questions/888335/… ).
Duncan Jones

1
stackoverflow.com/questions/24573643/… çok iyi bir çözüme sahiptir.
Pankaj Kumar

Yanıtlar:


589

IntelliJ IDEA'nın eski bir sürümüne sahip olduğunuzdan emin değilim, ancak DosyaAyarlar ...DenetimlerSerileştirme sorunları → 'serialVersionUID' 'etkinleştirilmeden seri hale getirilebilir sınıfa gidersem, sağladığınız sınıf bana uyarı verir.

Resim açıklamasını buraya girin

Birinci sınıfı denersem şunu görürüm:

Resim açıklamasını buraya girin

BTW: { }Derleme hatasını düzeltmek için her sınıfın sonuna eklenene kadar bana bir uyarı göstermedi .


2
Deneyin File| Invalidate Cachesyardımcı olmazsa, çoğaltmak için örnek bir projeyle support@jetbrains.com adresine başvurun.
CrazyCoder

1
idea.logİstisnalar için (Yardım | Giriş Yap ...) kontrol edin , Linux'ta şifrelenmiş giriş dizininin çekirdek hatası nedeniyle sorunlara neden olduğu bilinmektedir .
CrazyCoder

1
orada çok istisnalar var .. java.lang.NoClassDefFoundError gibi: org / intellij / lang / ek açıklamalar / MagicConstant;
Kirill Bazarov

2
IDEA'yı yeniden yükledim ve eklentileri kaldırdım ve bana yardımcı oldu. Çok teşekkürler.
Kirill Bazarov

5
V15'te çalışmanın yolu, uyarıyı görmek ve faremi yavaşça oluğa doğru hareket ettirmek için ClassName'in üzerine gelmektir. Bu noktada ekranda "ampul" belirir. (İlk kez amaçlandığı gibi çalışmazsa bunu birkaç kez deneyin). Ardından, kullanıcı kimliği oluşturmak için alan oluştur seçeneğini tıklayabilirsiniz. Umarım bu, sıkışmış insanlara yardımcı olur.
Niyaz

173

Olivier Descout'un GenerateSerialVersionUID eklentisini yükleyin .

Git: menüde DosyaAyarlarEklentileriGöz depolarıGenerateSerialVersionUID

Eklentiyi yükleyin ve yeniden başlatın.

Şimdi kodu CodeGenerate → serialVersionUID` menüsünden veya kısayoldan oluşturabilirsiniz.


14
Bunun çalışabilmesi için harici bir eklenti gerekir mi?
H.Rabiee

Evet, zaten IntelliJ eklenti deposunun bir parçası olan bir eklentiye ihtiyacınız var.
Sileria

Intellij IDEA 12.1
Sagar Hatekar'da

Benim için çalışıyor 13.0.2.
user1978019

Android Studio 0.8.9 üzerinde çalışıyor
Itai Hanski

67

Herhangi bir eklenti olmadan: IntelliJ'de vurgulamayı etkinleştirmeniz yeterlidir:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'- bayrak ayarlayın ve tıklayın 'OK'.

Şimdi, sınıfınız uygularsa Serializable, vurgulamayı görürsünüz ve alt+Entersınıfta ad oluşturmayı önerirsiniz private static final long serialVersionUID.

Not: Buradan alındı


4
Teşekkürler. Neden ampulü göremiyorum bilmiyorum, ama sınıf adını tıklayıp Alt-Enter yazmanız hile yapıyor.
John S


bu daha güncel
Christian Matthew

39

Serileştirme üzerine biraz zaman geçirdikten sonra, serialVersionUIDrastgele bir değer üretmememiz gerektiğini, anlamlı bir değer vermemiz gerektiğini görüyorum.

İşte bununla ilgili ayrıntılı bir yorum. Buraya yorum yazıyorum.

Aslında, seri sürüm UID'lerini "oluşturmamanız" gerekir. Bu kimliğin Java tarafından nasıl kullanıldığının genel yanlış anlaşılmasından kaynaklanan aptal bir "özellik" tir. Bu kimliklere anlamlı, okunabilir değerler vermelisiniz, örneğin 1L ile başlamalı ve sınıfın yeni sürümünün (daha önce serileştirilmiş olabilecek) tüm eski sürümleri geçersiz kıldığını her düşündüğünüzde bu değerleri artırmalısınız. Bu tür kimlikleri üreten tüm yardımcı programlar, kimlik tanımlanmadığında temel olarak JVM'nin yaptığı şeyi yapar: değeri, sınıf dosyasının içeriğine dayalı olarak üretir, dolayısıyla okunamayan anlamsız uzun tamsayılarla gelir. Sınıfınızın her bir versiyonunun (JVM'nin gözlerinde) farklı olmasını istiyorsanız, JVM'nin anında bir tane üreteceği durumlarda serialVersionUID değerini belirtmemelisiniz. ve sınıfınızın her sürümünün değeri benzersiz olacaktır. Bu değeri açıkça tanımlamanın amacı, serileştirme mekanizmasına sınıfın aynı SVUID değerine sahip farklı sürümlerini, örneğin daha eski serileştirilmiş sürümleri reddetmemesini öğretmesini söylemektir. Bu nedenle, kimliği tanımlarsanız ve asla değiştirmezseniz (ve otomatik üretime bağlı olduğunuzdan yaptığınız şey bu olduğunu ve muhtemelen kimliklerinizi asla yeniden oluşturmamanız gerektiğini varsayarsanız), sınıfınız serileştirme mekanizması tarafından aynı kabul edilecektir. İstediğin bu mu? Değilse ve gerçekten nesnelerinizin nasıl tanındığı üzerinde kontrol sahibi olmak istiyorsanız, sınıfın önemli ölçüde değiştiğine karar verdiğinizde anlayabileceğiniz ve kolayca güncelleyebileceğiniz basit değerleri kullanmalısınız.

Bu yardımcı olur umarım. İyi şanslar.


2
Teşekkürler, bu basit gerçeği çok uzun zamandır atlıyordum!
dedek

1
serialVersionUIDAskerileştirme ile ilgili eski sürümleri desteklemek istemediğimde, yeni bir rasgele sayı ile yeniden üreteceğim . Belki rastgele sayılar kullanmama gerek yok ama 1 ile başlayıp artırabilirim. Ancak, 3Lo zaman benim için daha fazla anlamı yok -3518231192373568183L. Bu nedenle, her iki çözümün de benzer şekilde çalıştığını düşünüyorum. Rastgele sayı, çatal ve dallarla doğrusal olmayan geçmişlere dayanma avantajına sahip olabilir.
JojOatXGME

16

Değer üretmek için

private static final long serialVersionUID = $randomLong$L;
$END$

ve randomLong şablon değişkenine şu değeri sağlayın: groovyScript ("new Random (). nextLong (). abs ()")

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/


1
Bu yorumu seviyorum, canlı şablonları kullanarak bu kesinlikle en hızlı çözüm ve en özelleştirilebilir (örneğin newline'ı kaldırdım). Yapılandırmak için Android Studio> Tercihler> Editör> Canlı Şablonlar'a gidin ve bu değerle yeni bir tane oluşturun (artı simgesi) ve betiği girmek için düzenleme değişkenlerini kullanın
hcpl

13

Ayrıca işi yapacak canlı şablon ekleyebilirsiniz.

Bunu yapmak için Ctrl+Alt+S-> "Live Templates"bölüm -> other(veya w / e ile) tuşuna basın

Ve sonra böyle bir tanımla yeni bir tane oluşturun:

private static final long serialVersionUID = 1L;
$END$

Ardından definitionkapsamı seçin ve olarak kaydedin'serial'

Şimdi serialTABsınıf gövdesini yazabilirsiniz .


3

SerialVersionUID'yi oluşturmanın başka bir yolu >Analyze >Run Inspection by Name, bağlam menüsünden (veya varsayılan olarak ctrl+ alt+ shift+ olan klavye kısayolunu i) kullanmak ve sonra "serialVersionUID" olmadan seri hale getirilebilir sınıf "yazmak (veya basitçe" serialVersionUID "ve öndeki türü yazmaktır işlevi sizin için bulacaktır.

Fikir> Analiz Et> Denetimi İsme Göre Çalıştır Daha sonra, denetimlerin nerede çalıştırılacağını seçebileceğiniz bir bağlam menüsü alacaksınız (örneğin, belirli bir modülden, tüm projeden, bir dosyadan ...)

Bu yaklaşımla, genel denetim kurallarını herhangi bir şeye ayarlamanız bile gerekmez.


Güzel, bu benim için işi yaptı. Eksik değişkeni buldu ve ekleme seçeneğini sundu.
arenaq

@arenaq memnun, bu başka birine yardımcı oldu ;-)
Alexander

2

Sürüm ile v2018.2.1

Adresine git

Tercih> Editör> Denetimler> Java> Serileştirme sorunları> "'serialVersionUID' olmadan serileştirilebilir sınıf" geçişini yapın.

Sınıf bildiriminin yanında bir uyarı görünmelidir.


1

Android Studio 2.1 kullanıyorum ve ampul adı almak için daha iyi bir tutarlılığa sahibim ve adı bir saniye daha üzerine getirin.


1

Diğer gruba "ser" adlı canlı bir şablon ekleyin, bunu "Java'da Uygulanabilir: bildirimi" olarak ayarlayın ve "FQ adlarını kısalt" seçeneğinin işaretini kaldırın. Şuna sadece bir şablon metni verin:

$serial$

Şimdi değişkenleri düzenleyin ve seriyi şu şekilde ayarlayın:

groovyScript("(System.env.JDK_HOME+'/bin/serialver -classpath '+com.intellij.openapi.fileEditor.FileDocumentManager.instance.getFile(_editor.document).path.replaceAll('/java/.*','').replaceAll('/src/','/build/classes/')+' '+_1).execute().text.replaceAll('.*: *','')",qualifiedClassName())

Standart Gradle proje düzenini varsayar. Maven için / build / to / target / öğesini değiştirin.


1

En kolay modern yöntem: Alt+ Enteraçık

private static final long serialVersionUID = ;

IntelliJ, alanın altını çizecektir =. imlecinizi üzerine getirin ve Mac'te alt+ Enter( Option+ Enter) tuşlarına basın. "SerialVersionUID başlatıcıyı rastgele değiştir" yazan bir pop-up alırsınız. Enter tuşuna bastığınızda, bu alanı rastgele uzun bir süre dolduracak.


0

Bir sürü dosya için serialVersionUID eksiklerini eklemek istiyorsanız, IntelliJ IDEA çok iyi çalışmayabilir. Bu hedefi kolaylıkla yerine getirmek için basit bir senaryo hazırladım:

base_dir=$(pwd)
src_dir=$base_dir/src/main/java
ic_api_cp=$base_dir/target/classes

while read f
do
    clazz=${f//\//.}
    clazz=${clazz/%.java/}
    seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
    perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

Bu komut dosyasını, klasörünüzde olduğu add_serialVersionUID.shgibi kaydedin ~/bin. Sonra Maven veya Gradle projenizin kök dizininde çalıştırın:

add_serialVersionUID.sh < myJavaToAmend.lst

Bu .lst, serialVersionUID öğesini aşağıdaki biçimde eklemek için Java dosyalarının listesini içerir:

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

Bu komut dosyası JDK serialVer aracını kullanır. Eski sınıflarla uyumluluğu korurken, serialVersionUID ilk başta ayarlanmamış çok sayıda sınıfı değiştirmek istediğinizde durum için idealdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.