ইন্টেলিজ আইডিইএ সিরিয়াল ভার্সনইউডিউ উত্পাদন করছে


297

কীভাবে ইন্টেলিজ আইডিইএতে এই মানটি তৈরি করা যায়?

আমি সেটিংসে -> ত্রুটিগুলি -> সিরিয়ালাইজেশন সমস্যাগুলি -> 'সিরিয়াল ভার্সনইউইউডিউড' ছাড়াই সিরিয়ালাইজযোগ্য ক্লাসে যাই, তবে এটি এখনও আমাকে সতর্কতা প্রদর্শন করে না। আমার ক্লাস PKladr বিল্ডিং পিতামাতার ইন্টারফেস সিরিয়ালাইজেবল কার্যকর করে ।

কোডের অংশ:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
আপনি কি নিশ্চিত যে নিজের মান নির্ধারণ করার পরিবর্তে আপনাকে কোনও মান উত্পন্ন করতে হবে? আপনি যদি একটি নতুন শ্রেণি তৈরি করে থাকেন তবে আমি আপনাকে উদাহরণস্বরূপ 1Lআপনার আইডি এবং বর্ধিত হিসাবে যখন আপনার সিরিয়ালযুক্ত ফর্ম পরিবর্তন করবে তখন আপনাকে সংজ্ঞায়িত করার পরামর্শ দিচ্ছি । ( স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 888335/… দেখুন )।
ডানকান জোন্স

1
stackoverflow.com/questions/24573643/… এর খুব ভাল সমাধান রয়েছে।
পঙ্কজ কুমার

উত্তর:


588

আমি নিশ্চিত করুন যে আপনি IntelliJ ধারণা একটি পুরোনো সংস্করণ আছে যদি নই, কিন্তু যদি আমি মেনুতে যান ফাইলসেটিংস ...পরিদর্শনধারাবাহিকতাতে বিষয় → 'serialVersionUID'` ছাড়া Serializable বর্গ সক্রিয়, বর্গ আপনি প্রদান আমাকে সতর্কবার্তা দিতে।

এখানে চিত্র বিবরণ লিখুন

আমি যদি প্রথম ক্লাসটি দেখি তবে:

এখানে চিত্র বিবরণ লিখুন

বিটিডাব্লু: { }সংকলনের ত্রুটিটি সংশোধন করার জন্য প্রতিটি ক্লাসের শেষে যোগ না করা পর্যন্ত এটি আমাকে কোনও সতর্কতা দেখায়নি ।


2
চেষ্টা করুন File| Invalidate Caches, যদি এটি সহায়তা না করে তবে পুনরুত্পাদন করার জন্য একটি নমুনা প্রকল্পের সাথে support@jetbrains.com এ যোগাযোগ করুন।
ক্রেজি কোডার

1
idea.logব্যতিক্রমগুলির জন্য (সহায়তা | লগইন প্রকাশ করুন ...) চেক করুন, লিনাক্সে এনক্রিপ্ট করা হোম ডিরেক্টরি কার্নেল বাগের কারণে সমস্যার কারণ হিসাবে পরিচিত ।
ক্রেজি কোডার

1
আমার সেখানে প্রচুর ব্যতিক্রম আছে .. java.lang.NoClassDefFoundError এর মত: org / intellij / lang / annotations / MagicConstant;
কিরিল বাজারভ

2
আমি আইডিইএ পুনরায় ইনস্টল করেছি এবং প্লাগইনগুলি সরিয়েছি এবং এটি আমাকে সহায়তা করে। Tnx অনেক।
কিরিল বাজারভ

5
আমি যেভাবে v15 এ এটি কাজ করেছিলাম তা হ'ল সতর্কতাটি দেখার জন্য ক্লাসনামের ওপরে ঘোরাফেরা করা এবং আমার মাউসটি নর্দমার দিকে ধীরে ধীরে সরিয়ে নেওয়া। এই মুহুর্তে "লাইটবুলব" পর্দায় প্রদর্শিত হয়। (এটি যদি প্রথমবারের মতো কাজ না করে তবে কয়েকবার চেষ্টা করুন)। তারপরে আপনি ইউইডি তৈরির জন্য ক্রल्ड ফিল্ড অপশনে ক্লিক করতে পারেন। আশা করি এটি এতে আটকে থাকা লোকদের সহায়তা করবে।
নিয়জ

173

অলিভিয়ার ডেসকাউট দ্বারা জেনারেটসরিয়াল ভার্সনউইডি প্লাগইন ইনস্টল করুন

এতে যান: মেনু ফাইলসেটিংসপ্লাগইনসব্রাউজ সংগ্রহস্থলGenerateSerialVersionUID

প্লাগইনটি ইনস্টল করুন এবং পুনরায় চালু করুন।

এখন আপনি মেনু কোডজেনারেট → সিরিয়াল ভার্সনউইডিউইডি বা শর্টকাট থেকে আইডি উত্পন্ন করতে পারেন ।


14
এই কাজটি করার জন্য কারও কি সত্যিই একটি বাহ্যিক প্লাগইন প্রয়োজন?
এইচ.রাবি

হ্যাঁ আপনার একটি প্লাগইন দরকার যা ইতিমধ্যে ইন্টেলিজি প্লাগইন সংগ্রহস্থলের অংশ।
সিলেরিয়া

ইন্টেলিজ আইডিএ 12.1
সাগর হাতেকার

13.0.2 এ আমার জন্য কাজ করে me
ব্যবহারকারী 1978019

অ্যান্ড্রয়েড স্টুডিও 0.8.9 এ কাজ করে
Itai

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

সিরিয়ালাইজেশনে কিছু সময় ব্যয় করার পরে, আমি এটি দেখতে পেলাম, আমাদের উত্পন্ন করা উচিত নয় serialVersionUID কিছু এলোমেলো মান , আমাদের উচিত এটি একটি অর্থপূর্ণ মান দেওয়া।

এখানে একটি বিশদ মন্তব্য। আমি এখানে মন্তব্য কপি করছি।

আসলে, আপনি সিরিয়াল সংস্করণ ইউআইডি "জেনারেট" করা উচিত নয়। এটি একটি বোবা "বৈশিষ্ট্য" যা জাভা দ্বারা কীভাবে আইডি ব্যবহার করা হয় তা সম্পর্কে সাধারণ ভুল বোঝাবুঝি থেকে উদ্ভূত হয়। আপনি এই আইডিগুলি অর্থবহ, পাঠযোগ্য মান, যেমন 1 এল দিয়ে শুরু করছেন এবং প্রতিবার ক্লাসের নতুন সংস্করণটি পূর্ববর্তী সংস্করণগুলি রেন্ডার করা উচিত (যা পূর্বে সিরিয়ালযুক্ত হতে পারে) অচল করে দেওয়া উচিত। এই জাতীয় ID তৈরি করে এমন সমস্ত ইউটিলিটিগুলি মূলত जेভিএম যা করে আইডি সংজ্ঞায়িত না করা হয়: তারা ক্লাস ফাইলের সামগ্রীর উপর ভিত্তি করে মান উত্পন্ন করে, তাই অপঠনযোগ্য অর্থহীন দীর্ঘ পূর্ণসংখ্যার সাথে আসে। আপনি যদি চান যে আপনার শ্রেণীর প্রতিটি সংস্করণ আলাদা হয় (জেভিএমের দৃষ্টিতে) তবে আপনি এমনকি সিরিয়াল ভার্সনউইড মানটি উল্লেখ করবেন না যেহেতু জেভিএম ফ্লাইতে একটি উত্পাদন করবে, এবং আপনার শ্রেণীর প্রতিটি সংস্করণের মান অনন্য হবে। সেই মানটি স্পষ্টভাবে সংজ্ঞায়নের উদ্দেশ্য হ'ল শ্রেণীর বিভিন্ন সংস্করণ যেমন একই এসভিইউডিটি রয়েছে সেগুলির সাথে একই আচরণ করার জন্য সিরিয়ালাইজেশন প্রক্রিয়াটি বলা, যেমন পুরানো সিরিয়ালযুক্ত সংস্করণগুলি প্রত্যাখ্যান করা নয়। সুতরাং, আপনি যদি আইডিটি সংজ্ঞায়িত করেন এবং কখনই এটিকে পরিবর্তন করেন না (এবং আমি ধরে নিই যে আপনি অটো-প্রজন্মের উপর নির্ভর করার পরে আপনি এটিই করেন এবং সম্ভবত আপনি আপনার আইডি পুনরায় উত্পন্ন করেন না) আপনি নিশ্চিত করছেন যে সমস্ত - এমনকি একেবারেই আলাদা - সংস্করণগুলির সংস্করণ সিরিয়ালাইজেশন প্রক্রিয়া দ্বারা আপনার শ্রেণি একই বিবেচিত হবে। তুমি কি এটাই চাও? যদি তা না হয় এবং যদি আপনার বস্তুগুলি কীভাবে স্বীকৃত হয় তার উপর আপনি যদি নিয়ন্ত্রণ রাখতে চান তবে ক্লাসটি উল্লেখযোগ্যভাবে পরিবর্তিত হয়েছে তা সিদ্ধান্ত নেওয়ার সময় আপনি নিজেরাই বুঝতে পারবেন এবং সহজেই আপডেট করতে পারবেন এমন সাধারণ মান ব্যবহার করা উচিত।

আশাকরি এটা সাহায্য করবে. শুভকামনা।


2
ধন্যবাদ, আমি এত দীর্ঘ সময় ধরে এই সাধারণ ঘটনাটি এড়িয়ে যাচ্ছিলাম!
উপার্জন করুন

1
আমি serialVersionUIDযখন ডিসরিয়ালাইজেশনে পুরানো সংস্করণগুলি সমর্থন করতে চাই না তখন আমি নতুন একটি এলোমেলো সংখ্যার সাথে পুনরায় উত্পন্ন করতাম। হয়তো আমার এলোমেলো সংখ্যা ব্যবহার করার দরকার নেই তবে 1 দিয়ে শুরু করতে এবং এটি বাড়িয়ে তুলতে পারি। তবে, 3Lতখন আমার কাছে এর বেশি অর্থ হয় না -3518231192373568183L। অতএব, আমি অনুমান করি যে উভয় সমাধান একইভাবে কাজ করে। যদিও এলোমেলো সংখ্যার পক্ষে এটি কাঁটাচামচ এবং শাখাবিহীন অ-রৈখিক ইতিহাসগুলির উপর জাগ্রত হতে পারে সে সুবিধাটি থাকতে পারে।
JojOatXGME

16

যাতে মান ব্যবহার করা যায়

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

এবং নিম্নলিখিত মান সহ এলোমেলোভাবে টেমপ্লেট ভেরিয়েবল সরবরাহ করুন: গ্রোভিস্ক্রিপ্ট ("নতুন র্যান্ডম ()। পরের লং ()। অ্যাবস ()")

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

সিরিয়াল ভার্সনিউডিউড তৈরির আরেকটি উপায় হ'ল >Analyze >Run Inspection by Nameকনটেক্সট মেনু (বা কীবোর্ড শর্ট কাট, যা ডিফল্টরূপে ctrl+ alt+ shift+ i) থেকে ব্যবহার করা হয় এবং তারপরে "সিরিয়ালভিশনিউড" ছাড়াই সিরিয়ালযোগ্য ক্লাস টাইপ করুন (বা কেবল "সিরিয়াল ভার্সনইউডিউ" টাইপ করুন এবং পরবর্তী ধরণটি লিখুন ফাংশন এটি আপনার জন্য খুঁজে পেতে হবে।

আইডিয়া> বিশ্লেষণ> নাম অনুসারে পরিদর্শন চালান তারপরে আপনি একটি প্রসঙ্গ মেনু পাবেন যেখানে আপনি কোথায় পরিদর্শন চালাতে পারবেন তা বেছে নিতে পারেন (যেমন সমস্ত নির্দিষ্ট মডিউল, পুরো প্রকল্প, একটি ফাইল, ...)

এই পদ্ধতির সাথে আপনাকে কোনও কিছুর জন্য সাধারণ পরিদর্শনের নিয়মও সেট করতে হবে না।


খুব ভাল, এটি আমার জন্য কাজ করেছে। এটি অনুপস্থিত ভেরিয়েবলটি খুঁজে পেয়েছে এবং এটি যুক্ত করার বিকল্পটি উপস্থাপন করেছে।
arenaq

@arenaq খুশি, এটি অন্য কাউকে সাহায্য করেছে ;-)
আলেকজান্ডার

2

সংস্করণ সহ v2018.2.1

যাও

পছন্দ> সম্পাদক> পরিদর্শন> জাভা> সিরিয়ালাইজেশন সমস্যাগুলি> "সিরিয়াল ভার্শনিউডিউড" ছাড়াই সিরিয়ালাইজযোগ্য শ্রেণি টগল করুন।

শ্রেণীর ঘোষণার পাশে একটি সতর্কতা উপস্থিত হওয়া উচিত।


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 = ;

ইন্টেলিজ-এর পরে স্পেসটিকে আন্ডারলাইন করবে =। এটিতে আপনার কার্সারটি চাপুন এবং alt+ Enter( Option+ Enterম্যাকে) টিপুন । আপনি এমন একটি পপওভার পাবেন যা বলছে "এলোমেলোভাবে সিরিয়ালভেরিউশনিউড ইনিশিয়ালাইজার পরিবর্তন করুন"। সবেমাত্র এন্টার টিপুন, এবং এটি স্থানটি এলোমেলোভাবে দীর্ঘায়িত করবে।


0

আপনি যদি একগুচ্ছ ফাইলের জন্য অনুপস্থিত সিরিয়াল ভার্সনইউডিটি যুক্ত করতে চান তবে ইন্টেলিজ আইডিইএ খুব ভাল কাজ করতে পারে না। সহজেই এই লক্ষ্যটি সম্পাদন করার জন্য আমি কিছু সাধারণ স্ক্রিপ্ট এলাম:

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 নীচে নিম্নলিখিত ফর্ম্যাটে সিরিয়াল ভার্সনইউডিউড যুক্ত করতে জাভা ফাইলগুলির তালিকা অন্তর্ভুক্ত করেছে:

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

এই স্ক্রিপ্টটি জেডিকে সিরিয়ালওয়ার সরঞ্জাম ব্যবহার করে। পুরানো শ্রেণীর সাথে সামঞ্জস্য বজায় রেখে আপনি যখন প্রচুর ক্লাস সংশোধন করতে চান যেখানে প্রথম দিকে কোনও সিরিয়াল ভার্সনইউড সেট ছিল না তখনই এটি পরিস্থিতির জন্য আদর্শ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.