IntelliJ IDEA सीरियलवर्जन यूआईडी जनरेट कर रहा है


297

IntelliJ IDEA में यह मान कैसे उत्पन्न करते हैं?

मैं सेटिंग्स में जाता हूं -> त्रुटियां -> सीरियलाइजेशन के मुद्दे -> सीरियल सीरियल 'के बिना सीरियल क्लास', लेकिन यह अभी भी मुझे चेतावनी नहीं दिखाता है। मेरी कक्षा PKladrBuilding माता-पिता के इंटरफ़ेस को सीरियल योग्य बनाता है ।

कोड का हिस्सा:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
क्या आप सुनिश्चित हैं कि आपको अपना खुद को परिभाषित करने के बजाय एक मूल्य उत्पन्न करने की आवश्यकता है? यदि आप एक नया वर्ग बना रहे हैं, तो मैं आपको सलाह दूंगा 1Lकि उदाहरण के लिए आपकी आईडी और वेतन वृद्धि के रूप में परिभाषित करें जब आपका क्रमबद्ध रूप बदलता है। (देखें stackoverflow.com/questions/888335/… )।
डंकन जोन्स

1
stackoverflow.com/questions/24573643/… एक बहुत अच्छा समाधान है।
पंकज कुमार

जवाबों:


588

मुझे यकीन नहीं है कि आपके पास IntelliJ IDEA का पुराना संस्करण है, लेकिन अगर मैं मेनू फ़ाइलसेटिंग्स ...इंस्पेक्शनसीरियलाइज़ेशन के मुद्दों पर जाता हूं, तो बिना सीरियल सीरियल U सीरियलवीआईडीयू ’’ सक्षम किए, जिस वर्ग को आप चेतावनी देते हैं।

यहां छवि विवरण दर्ज करें

अगर मैं प्रथम श्रेणी देखने की कोशिश करूँ तो:

यहां छवि विवरण दर्ज करें

BTW: जब तक मैंने { }संकलन त्रुटि को ठीक करने के लिए प्रत्येक वर्ग के अंत में नहीं जोड़ा, तब तक यह मुझे एक चेतावनी नहीं दिखाता था ।


2
कोशिश करो File| Invalidate Caches, अगर यह मदद नहीं करता है, तो support@jetbrains.com से संपर्क करें।
क्रेज़ीकोड

1
idea.logअपवादों के लिए चेक (हेल्प - रिवील लॉग इन ...), लिनक्स पर एन्क्रिप्टेड होम डायरेक्टरी कर्नेल बग की वजह से समस्या पैदा करने के लिए जानी जाती है ।
क्रेजीक्रोडर

1
मेरे पास बहुत सारे अपवाद हैं .. जैसे java.lang.NoClassDefFoundError: org / intellij / lang / annotations / MagicConstant;
किरिल बजावरो

2
मैंने IDEA को फिर से इंस्टॉल किया है और प्लग-इन को हटा दिया है और यह मेरी मदद करता है। Tnx बहुत।
किरिल बजावरो

5
जिस तरह से मुझे यह v15 में काम कर रहा है वह क्लासनैम पर चेतावनी को देखने के लिए मँडरा रहा है और अपने माउस को धीरे-धीरे नाली की ओर ले जाना है। उस बिंदु पर "लाइटबुलब" स्क्रीन पर दिखाई देता है। (यह पहली बार के रूप में काम नहीं करता है, तो कुछ बार प्रयास करें)। फिर आप uid बनाने के लिए create field विकल्प पर क्लिक करें। आशा है कि यह उन लोगों की मदद करता है जो इस पर अटके हुए हैं।
नियाज

173

Olivier Descout द्वारा GenerateSerialVersionUID प्लगइन स्थापित करें ।

पर जाएं: मेनू फ़ाइलसेटिंग्सप्लगइन्सब्राउज़ रिपॉजिटरीGenerateSerialVersionUID

प्लगइन स्थापित करें और पुनरारंभ करें।

अब आप मेनू कोड → आईडी जनरेट → serialVersionUID` या शॉर्टकट से आईडी जनरेट कर सकते हैं ।


14
क्या इस काम को पाने के लिए किसी बाहरी प्लगइन की आवश्यकता है?
एच। रैबी

हाँ, आपको एक प्लगइन की आवश्यकता है जो पहले से ही IntelliJ प्लगइन भंडार का हिस्सा है।
सिलेरिया

Intellij IDEA 12.1
सागर हेटकर

13.0.2 को मेरे लिए काम करता है।
user1978019

एंड्रॉइड स्टूडियो पर काम करता है 0.8.9
इताई हंसकी

67

किसी भी प्लगइन्स के बिना: आपको सिर्फ इंटेलीज में हाइलाइट सक्षम करने की आवश्यकता है:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'- झंडा सेट करें और क्लिक करें 'OK'

अब, यदि आपकी कक्षा लागू होती है Serializable, तो आप हाइलाइट देखेंगे, और alt+Enterक्लास के नाम पर जनरेट करने का प्रस्ताव रखेंगे private static final long serialVersionUID

पुनश्च: यहाँ से लिया गया


4
धन्यवाद। मुझे नहीं पता कि मुझे लाइट बल्ब क्यों नहीं दिख रहा है, लेकिन क्लास के नाम पर क्लिक करने और Alt-Enter टाइप करने से यह ट्रिक काम करता है।
जॉन एस।


यह अधिक अपटूडेट है
क्रिश्चियन मैथ्यू

39

Serialization पर कुछ समय बिताने के बाद, मुझे लगता है कि, हमें serialVersionUIDकुछ यादृच्छिक मूल्य के साथ उत्पन्न नहीं करना चाहिए , हमें इसे एक सार्थक मूल्य देना चाहिए।

इस पर एक विवरण टिप्पणी है। मैं यहाँ टिप्पणी का सामना कर रहा हूँ।

दरअसल, आपको UID के सीरियल संस्करण को "जेनरेट" नहीं करना चाहिए। यह एक गूंगा "सुविधा" है जो सामान्य गलतफहमी से उपजा है कि जावा द्वारा आईडी का उपयोग कैसे किया जाता है। आपको इन आईडी को सार्थक, पठनीय मान देना चाहिए, जैसे कि 1L के साथ शुरू करना, और हर बार जब आप सोचते हैं कि कक्षा के नए संस्करण को सभी पिछले संस्करणों को प्रस्तुत करना चाहिए (जो कि पहले क्रमबद्ध हो सकता है) अप्रचलित होना चाहिए। ऐसी आईडी बनाने वाली सभी उपयोगिताओं मूल रूप से वही करती हैं जो आईडी परिभाषित न होने पर जेवीएम करता है: वे क्लास फाइल की सामग्री के आधार पर मूल्य उत्पन्न करते हैं, इसलिए अपठनीय अर्थहीन लंबे पूर्णांक के साथ आते हैं। यदि आप चाहते हैं कि आपकी कक्षा का प्रत्येक संस्करण अलग-अलग हो (JVM की दृष्टि में), तो आपको क्रमांक निर्दिष्ट भी नहीं करना चाहिए, क्योंकि JVM मक्खी पर एक उत्पादन करेगा, और आपकी कक्षा के प्रत्येक संस्करण का मूल्य अद्वितीय होगा। उस मूल्य को स्पष्ट रूप से परिभाषित करने का उद्देश्य क्रमबद्धता तंत्र को वर्ग के विभिन्न संस्करणों के इलाज के लिए बताना है जिनके पास एक ही SVUID है जैसे कि वे समान हैं, जैसे कि पुराने क्रमबद्ध संस्करणों को अस्वीकार नहीं करना है। इसलिए, यदि आप आईडी को परिभाषित करते हैं और इसे कभी नहीं बदलते हैं (और मुझे लगता है कि आप जो करते हैं, उसके बाद से आप ऑटो-पीढ़ी पर भरोसा करते हैं, और आप शायद अपनी आईडी को फिर से उत्पन्न नहीं करते हैं) आप यह सुनिश्चित कर रहे हैं - यहां तक ​​कि बिल्कुल अलग - संस्करण आपकी कक्षा को क्रमांकन तंत्र द्वारा समान माना जाएगा। क्या तुम यही चाहते हो? यदि नहीं, और यदि आप वास्तव में इस बात पर नियंत्रण रखना चाहते हैं कि आपकी वस्तुओं को कैसे पहचाना जाता है, तो आपको उन सरल मूल्यों का उपयोग करना चाहिए जिन्हें आप स्वयं समझ सकते हैं और आसानी से अपडेट कर सकते हैं जब आप यह तय करते हैं कि कक्षा में काफी बदलाव आया है।

उम्मीद है की यह मदद करेगा। सौभाग्य।


2
धन्यवाद, मैं इतने लंबे समय के लिए इस सरल तथ्य को छोड़ रहा था!
घटाएं

1
मैं वास्तव में serialVersionUIDएक नए यादृच्छिक संख्या के साथ फिर से उत्पन्न करूंगा जब मैं पुराने संस्करणों को समर्थन के लिए समर्थन नहीं करना चाहता। शायद मुझे यादृच्छिक संख्या का उपयोग करने की आवश्यकता नहीं है, लेकिन 1 से शुरू कर सकते हैं और इसे बढ़ा सकते हैं। हालाँकि, 3Lतब मेरे लिए अधिक अर्थ नहीं है -3518231192373568183L। इसलिए, मुझे लगता है कि दोनों समाधान समान रूप से काम करते हैं। यादृच्छिक संख्या का लाभ यह हो सकता है कि यह कांटे और शाखाओं के साथ गैर-रेखीय इतिहास पर जागता है, हालांकि।
JoOOatXGME

16

मूल्य उपयोग उत्पन्न करने के लिए

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

और निम्न मान के साथ randomLong टेम्प्लेट चर प्रदान करें: groovyScript ("नया रैंडम ()। nextLong ()। abs ()")।

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


1
इस टिप्पणी से प्यार है, लाइव टेम्पलेट्स का उपयोग करना यह सुनिश्चित करने के लिए है कि सबसे तेज़ समाधान और सबसे अधिक अनुकूलन योग्य है (मैंने उदाहरण के लिए नई रूपरेखा हटा दी)। कॉन्फ़िगर करने के लिए एंड्रॉइड स्टूडियो पर जाएं> प्राथमिकताएं> संपादक> लाइव टेम्पलेट और इस मान के साथ एक नया (प्लस आइकन) बनाएं और स्क्रिप्ट में प्रवेश करने के लिए संपादित चर का उपयोग करें
hcpl

13

इसके अलावा आप लाइव टेम्पलेट जोड़ सकते हैं जो काम करेगा।

इसे करने के लिए Ctrl+Alt+S-> "Live Templates"अनुभाग -> other(या w / e आप चाहें)

और फिर इस तरह एक परिभाषा के साथ एक नया बनाएँ:

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

फिर definitionस्कोप को चुनें और इसे सेव करें'serial'

अब आप serialTABक्लास बॉडी में टाइप कर सकते हैं ।


3

SerialVersionUID को जनरेट करने का दूसरा तरीका है >Analyze >Run Inspection by Nameसंदर्भ मेनू (या कीबोर्ड शॉर्ट कट, जो कि ctrl+ alt+ shift+ iडिफ़ॉल्ट रूप से है) का उपयोग करना है और फिर "Serializable class without 'serialVersionUID' टाइप करें (या बस टाइप करें" serialVersionUID "और आगे टाइप करें समारोह यह आप के लिए मिल जाएगा।

विचार> विश्लेषण> नाम से निरीक्षण चलाएँ फिर आपको एक संदर्भ मेनू मिलेगा, जहां आप चुन सकते हैं कि निरीक्षण कहाँ पर चलाने के लिए (उदाहरण के लिए एक विशिष्ट मॉड्यूल, संपूर्ण परियोजना, एक फ़ाइल, ...)

इस दृष्टिकोण के साथ आपको सामान्य निरीक्षण नियमों को कुछ भी निर्धारित करने की आवश्यकता नहीं है।


अच्छा लगा, इसने मेरे लिए काम किया। यह लापता चर पाया और इसे जोड़ने का विकल्प प्रस्तुत किया।
अखाड़ा जूल

@arenaq को खुशी हुई, इससे किसी और को मदद मिली ;-)
Alexander

2

संस्करण के साथ v2018.2.1

के लिए जाओ

वरीयता> संपादक> निरीक्षण> जावा> क्रमिकरण के मुद्दे> "सीरियलव्यूडयूआईडी" के बिना "सीरियल योग्य श्रेणी" टॉगल करें।

वर्ग घोषणा के बगल में एक चेतावनी दिखाई देनी चाहिए।


1

मैं एंड्रॉइड स्टूडियो 2.1 का उपयोग कर रहा हूं और मुझे कक्षा नाम पर क्लिक करके लाइटबल्ब प्राप्त करने की बेहतर निरंतरता है और इसके लिए एक दूसरे पर होवर करें।


1

दूसरे समूह में "सेर" नामक एक लाइव टेम्प्लेट जोड़ें, इसे "जावा में लागू: घोषणा" में सेट करें और "शॉर्ट एफक्यू नाम" को अनचेक करें। इसे सिर्फ एक टेम्प्लेट दें:

$serial$

अब चरों को संपादित करें और धारावाहिक सेट करें:

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())

यह मानक ग्रेड प्रोजेक्ट लेआउट को मानता है। मावेन के लिए / निर्माण / / / लक्ष्य / के लिए।


1

सबसे आधुनिक विधि: Alt+ Enterपर

private static final long serialVersionUID = ;

IntelliJ के बाद अंतरिक्ष को रेखांकित करेगा =। इस पर अपना कर्सर रखें और alt+ Enter( Option+ Enterमैक पर) को हिट करें । आपको एक पॉपओवर मिलेगा जो कहता है "बेतरतीब ढंग से धारावाहिक बदलें यूआईडी प्रारंभिक"। बस हिट दर्ज करें, और यह एक यादृच्छिक लंबे समय के साथ उस स्थान को आबाद करेगा।


0

यदि आप फ़ाइलों के एक समूह के लिए अनुपस्थित serialVersionUID जोड़ना चाहते हैं, तो IntelliJ IDEA बहुत अच्छा काम नहीं कर सकता है। इस लक्ष्य को आसानी से पूरा करने के लिए मैं कुछ सरल स्क्रिप्ट लेकर आया हूं:

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

आप इस स्क्रिप्ट को सहेजते हैं, add_serialVersionUID.shअपने ~/binफ़ोल्डर में कहते हैं । फिर आप इसे अपने मावेन या ग्रेडल प्रोजेक्ट की रूट डायरेक्टरी में चलाते हैं जैसे:

add_serialVersionUID.sh < myJavaToAmend.lst

इसमें .lst में निम्नलिखित प्रारूप में serialVersionUID जोड़ने के लिए जावा फ़ाइलों की सूची शामिल है:

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

यह स्क्रिप्ट JDK serialVer टूल का उपयोग करती है। यह एक ऐसी स्थिति के लिए आदर्श है जब आप बड़ी संख्या में ऐसी कक्षाओं में संशोधन करना चाहते हैं, जिनमें पुरानी कक्षाओं के साथ संगतता बनाए रखते हुए पहली बार में कोई सीरियलवीयूआईडी सेट नहीं था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.