সিরিয়াল ভার্সনইউইউডিটি কী এবং আমি কেন এটি ব্যবহার করব?


2997

যখন কোনও serialVersionUIDঅনুপস্থিত থাকে তখন গ্রহপ সতর্কতা জারি করে ।

সিরিয়ালীকরণযোগ্য ক্লাস ফু দীর্ঘ ধরণের স্থিতিশীল চূড়ান্ত সিরিয়াল সংস্করণ সূত্রটি ঘোষণা করে না

কী serialVersionUIDএবং কেন এটি গুরুত্বপূর্ণ? অনুপস্থিত serialVersionUIDএকটি সমস্যার কারণ যেখানে দয়া করে একটি উদাহরণ দেখান ।


1
ক্রমবর্ধমানের সম্পর্কে একটি ভাল অনুশীলন সন্ধান করুন; dzone.com/articles/
কি-

উত্তর:


2289

java.io.Serializableআপনি যেভাবে পাবেন তার জন্য দস্তাবেজগুলি সম্ভবত খুব ভাল ব্যাখ্যা হিসাবে রয়েছে:

সিরিয়ালাইজেশন রানটাইমটি প্রতিটি সিরিয়ালযোগ্য ক্লাসের সাথে একটি সংস্করণ সংখ্যার সাথে সহযোগিতা করে, যাকে বলা হয় serialVersionUID, যা সিরিয়ালাইজড অবজেক্টের প্রেরক এবং গ্রহীতা সিরিজটির সাথে সামঞ্জস্যপূর্ণ সেই বস্তুর জন্য ক্লাসগুলি লোড করেছে তা যাচাই করার জন্য ডিসরিয়ালেসনের সময় ব্যবহৃত হয়। যদি প্রাপক serialVersionUIDসংশ্লিষ্ট প্রেরকের শ্রেণীর চেয়ে পৃথক পৃথক অবজেক্টের জন্য কোনও শ্রেণি লোড করে থাকে , তবে deserialization এর ফলস্বরূপ একটি হবে InvalidClassException। সিরিয়ালীকরণযোগ্য শ্রেণিটি এমন serialVersionUIDএকটি ক্ষেত্রের নাম ঘোষণা করে নিজের স্পষ্টভাবে ঘোষণা serialVersionUIDকরতে পারে যা অবশ্যই স্থির, চূড়ান্ত এবং প্রকারের হতে হবে long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

যদি সিরিয়ালাইজযোগ্য শ্রেণি স্পষ্টভাবে একটি ঘোষণা করে না serialVersionUID, তবে serialVersionUIDজাভা (টিএম) অবজেক্ট সিরিয়ালাইজেশন স্পেসিফিকেশনে বর্ণিত সিরিয়ালাইজেশন রানটাইম ক্লাসের বিভিন্ন দিকের ভিত্তিতে সেই শ্রেণীর জন্য একটি ডিফল্ট মান গণনা করবে । যাইহোক, এটি দৃ recommended়ভাবে সুপারিশ করা হয় যে সমস্ত সিরিয়ালযোগ্য ক্লাসগুলি স্পষ্টভাবে serialVersionUIDমানগুলি ঘোষণা করে , যেহেতু ডিফল্ট serialVersionUIDগণনা শ্রেণীর বিবরণগুলির সাথে অত্যন্ত সংবেদনশীল যা সংকলক বাস্তবায়নের উপর নির্ভর করে পরিবর্তিত হতে পারে এবং ফলস্বরূপ InvalidClassExceptionsdeserialization সময় অপ্রত্যাশিত হতে পারে can অতএব, serialVersionUIDবিভিন্ন জাভা সংকলক বাস্তবায়ন জুড়ে একটি সামঞ্জস্যপূর্ণ মান গ্যারান্টি দিতে , একটি সিরিয়ালাইজ বর্গ অবশ্যই একটি সুস্পষ্ট serialVersionUIDমান ঘোষণা করতে হবে । এটি দৃ strongly়ভাবে যে স্পষ্টভাবে পরামর্শ দেওয়া হয়serialVersionUIDঘোষণাগুলি যেখানে সম্ভব সেখানে প্রাইভেট মডিফায়ার ব্যবহার করে, যেহেতু এই জাতীয় ঘোষণাগুলি কেবল তাত্ক্ষণিকভাবে ঘোষিত শ্রেণীর serialVersionUIDক্ষেত্রগুলির ক্ষেত্রে উত্তরাধিকারী সদস্য হিসাবে কার্যকর নয়।


325
সুতরাং, আপনি মূলত যা বলছেন তা হ'ল কোনও ব্যবহারকারী যদি উপরের সমস্ত উপাদান বুঝতে না পারে, তবে ব্যবহারকারী কি সিরিয়ালাইজেশন সম্পর্কে উদ্বেগ প্রকাশ করবেন না? আমি বিশ্বাস করি আপনি "কিভাবে?" বরং "কেন?" ব্যাখ্যা করার চেয়ে। আমি, একের জন্য, কেন সিরিয়ালাইজেবল ভার্সনইউইডিটি দিয়ে আমাকে বিরক্ত করব তা বুঝতে পারি না।
জিগজি

365
দ্বিতীয় অনুচ্ছেদে কেন রয়েছে: আপনি যদি স্পষ্টরূপে সিরিয়াল ভার্সনিউডিউড নির্দিষ্ট না করেন তবে একটি মান স্বয়ংক্রিয়ভাবে উত্পন্ন হয় - তবে এটি ভঙ্গুর কারণ এটি সংকলক বাস্তবায়ন নির্ভর।
জন স্কিটি

14
এবং কেন গ্রীকটি বলে যে আমার "প্রাইভেট স্ট্যাটিক ফাইনাল লং সিরিয়াল ভার্শনিউডিউ = 1 এল প্রয়োজন;" আমি কখন ব্যতিক্রম ক্লাস বাড়িয়ে দেব?
জনমারলিনো

21
@JohnMerlino আচ্ছা আমি এটা তোমার বলার আশা না প্রয়োজন এক - কিন্তু এটা হতে পারে পরামর্শ সাহায্য আপনি সঠিকভাবে ব্যতিক্রম ধারাবাহিকভাবে করার জন্য এক। আপনি যদি সেগুলি ক্রমিকায়িত করতে যাচ্ছেন না, তবে আপনার সত্যিকারের ধ্রুবকের প্রয়োজন নেই।
জন স্কিটি

16
@ জনমারলিনো, আপনার যে অংশটির প্রশ্ন রয়েছে তার জবাব দেওয়ার জন্য: ব্যতিক্রম সিরিয়ালাইজেবল কার্যকর করে এবং গ্রহনটি হুঁশিয়ারি দেয় যে আপনি একটি সিরিয়াল ভার্সনউইড সেট করেননি, যা জোনস্কির পোস্টের সমস্যাগুলি এড়াতে ভাল ধারণা হবে (আপনি যদি শ্রেণিটি সিরিয়ালায়িত করতে চান না) রূপরেখা।
zpon

475

আপনি যদি কেবল সিরিয়ালাইজিং করছেন কারণ আপনাকে বাস্তবায়নের প্রয়োজনে সিরিয়ালাইজ করতে হবে ( HTTPSessionউদাহরণস্বরূপ, আপনি যদি এটির জন্য সিরিয়ালীকরণ করেন তবে কে সে চিন্তা করে ... যদি এটি সংরক্ষণ করা হয় বা না থাকে তবে আপনি সম্ভবত de-serializingকোনও ফর্ম অবজেক্টের যত্ন নেবেন না) এটি উপেক্ষা করুন।

আপনি যদি সত্যই সিরিয়ালাইজেশন ব্যবহার করে থাকেন তবে কেবলমাত্র সিরিয়ালাইজেশন ব্যবহার করে অবজেক্টগুলি সংরক্ষণ এবং পুনরুদ্ধার করার পরিকল্পনা করার পরে কেবল এটিই গুরুত্বপূর্ণ। serialVersionUIDআপনার বর্গ সংস্করণ প্রতিনিধিত্ব করে, এবং আপনি এটি বাড়ায় উচিত আপনার বর্গ এর বর্তমান সংস্করণ পিছন তার পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যপূর্ণ নয়।

বেশিরভাগ সময়, আপনি সম্ভবত সরাসরি সিরিয়ালাইজেশন ব্যবহার করবেন না। যদি এটি হয় তবে SerialVersionUIDদ্রুত সমাধান বিকল্পটি ক্লিক করে একটি ডিফল্ট উত্পন্ন করুন এবং এটি সম্পর্কে চিন্তা করবেন না।


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

25
আমি দেখতে পাচ্ছি না যে কীভাবে একটি লাইন যুক্ত করা হবে (@ সাপ্রেস ওয়ার্নিংস টিকা) অন্য লাইনের বিপরীতে (সিরিয়ালাইজযোগ্য আইডি) "ক্লাস কম ক্লাটার"। এবং যদি আপনি স্থায়ী সঞ্চয়স্থানের জন্য সিরিয়ালাইজেশন ব্যবহার না করে থাকেন তবে আপনি কেবল "1" ব্যবহার করবেন না কেন? আপনি যেভাবে যাইহোক সে ক্ষেত্রে স্বয়ংক্রিয় জেনারেটেড আইডি সম্পর্কে চিন্তা করবেন না।
MetroidFan2002

71
@ মেট্রয়েডফ্যান ২০০২: আমি মনে করি @ টমএন্ডারসনের serialVersionUIDআপনাকে বেমানান পরিবর্তন থেকে রক্ষা করার বিষয়টি বৈধ। ব্যবহার @SuppressWarningsনথি অভিপ্রায় ভাল আপনি স্থায়ী সঞ্চয়ের জন্য বর্গ ব্যবহার করতে চান, না হলে।
আব্দুল্লাহসি

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

4
ক্লাসের প্রাথমিক লেখক স্পষ্টভাবে পরিচয় করিয়ে দেওয়ার সাথে সাথে সিরিয়াল ভার্সনইউডিউডের @EJP ইনক্রিমেন্টটি ছবিতে আসে I আমি বলব, জেভিএম জেনারেল সিরিয়াল আইডি ঠিক আছে। এটি সিরিয়ালাইজেশনে আমি দেখেছি সেরা উত্তর
ওভাররেজচেঞ্জ

307

জোশ ব্লচের কার্যকরী জাভা (দ্বিতীয় সংস্করণ) বইটি প্লাগ করার জন্য আমি এই সুযোগটি পার করতে পারি না । ১১ তম অধ্যায়টি জাভা সিরিয়ালাইজেশনের একটি অনিবার্য সংস্থান।

জোশের প্রতি, স্বয়ংক্রিয়ভাবে উত্পাদিত ইউআইডি একটি শ্রেণীর নাম, প্রয়োগকৃত ইন্টারফেস এবং সমস্ত পাবলিক এবং সুরক্ষিত সদস্যের ভিত্তিতে তৈরি করা হয়েছে। যেকোন উপায়ে এগুলির যে কোনওটি পরিবর্তন করলে পরিবর্তন হবে serialVersionUID। সুতরাং আপনার কেবল তাদের সাথে জগাখিচির দরকার নেই যদি আপনি নিশ্চিত হন যে ক্লাসের একের বেশি সংস্করণ কখনও সিরিয়ালযুক্ত হবে না (হয় প্রক্রিয়াগুলি জুড়ে বা পরবর্তী সময়ে স্টোরেজ থেকে পুনরুদ্ধার করা হবে)।

আপনি এখন তাদের যদি বাদ দেই, এবং পরে যে আপনার কিছু উপায় বর্গ পরিবর্তন কিন্তু সামঞ্জস্য W / বর্গ পুরোনো সংস্করণ, আপনি JDK সরঞ্জামটি ব্যবহার করতে পারেন বজায় রাখতে হবে এটি serialver জেনারেট করতে serialVersionUIDউপর বয়সী বর্গ, এবং স্পষ্টভাবে নির্ধারণ নতুন ক্লাসে। (আপনার পরিবর্তনগুলির উপর নির্ভর করে আপনাকে সংযোজন writeObjectএবং readObjectপদ্ধতিগুলি দ্বারা কাস্টম সিরিয়ালাইজেশন প্রয়োগ করতেও পারে - Serializableজাভাদোক বা পূর্বোক্ত অধ্যায় ১১ দেখুন)


33
সুতরাং কেউ সিরিয়ালাইজেবল ভার্সনইউডিউ নিয়ে বিরক্ত করতে পারে যদি কোনও শ্রেণীর সামঞ্জস্যতা ডাব্লু / পুরানো সংস্করণ সম্পর্কে উদ্বিগ্ন হন?
জিগজি

10
হ্যাঁ, যদি নতুন সংস্করণটি কোনও পাবলিক সদস্যকে সুরক্ষিত হিসাবে পরিবর্তিত করে, তবে ডিফল্ট সিরিয়ালাইজেবল ভার্সনইউডিইউ আলাদা হবে এবং একটি অবৈধ ক্লাসেক্সেপশন উত্থাপন করবে।
চন্দ্র শিবদাসানী

3
শ্রেণীর নাম, বাস্তবায়িত ইন্টারফেস, সমস্ত পাবলিক এবং সুরক্ষিত পদ্ধতি, সমস্ত উদাহরণ ভেরিয়েবল।
পৌঁছান

31
লক্ষণীয় যে জোশুয়া ব্লচ পরামর্শ দিয়েছেন যে প্রতিটি সিরিয়ালাইজযোগ্য শ্রেণীর জন্য এটি সিরিয়াল সংস্করণ ইউআইডি নির্দিষ্ট করে তোলা উচিত। ১১ অধ্যায় থেকে উদ্ধৃতি: আপনি যে সিরিয়ালাইজড ফর্মটি বেছে নিন তা নির্বিশেষে, আপনার লেখার প্রতিটি ক্রমিক শ্রেণিতে সুস্পষ্ট সিরিয়াল সংস্করণ ইউআইডি ঘোষণা করুন। এটি অসম্পূর্ণতার সম্ভাব্য উত্স (আইটেম 74) হিসাবে সিরিয়াল সংস্করণ ইউআইডি সরিয়ে দেয়। একটি ছোট কর্মক্ষমতা সুবিধা আছে। যদি কোনও সিরিয়াল সংস্করণ ইউআইডি সরবরাহ না করা হয়, রানটাইম সময় একটি ব্যয় করতে একটি ব্যয়বহুল গণনা প্রয়োজন।
আশুতোষ জিন্দাল

136

আপনি Eclipse কে এই সিরিয়াল ভার্সনইউডি সতর্কতাগুলি উপেক্ষা করতে বলতে পারেন:

উইন্ডো> পছন্দসমূহ> জাভা> সংকলক> ত্রুটি / সতর্কতা> সম্ভাব্য প্রোগ্রামিং সমস্যা

আপনি যদি না জানতেন তবে এই বিভাগে আপনি সক্ষম করতে পারেন এমন আরও অনেক সতর্কতা রয়েছে (বা কিছুকে ত্রুটি হিসাবেও প্রতিবেদন করা হয়েছে), অনেকগুলি দরকারী:

  • সম্ভাব্য প্রোগ্রামিং সমস্যা: সম্ভাব্য দুর্ঘটনাজনক বুলিয়ান অ্যাসাইনমেন্ট
  • সম্ভাব্য প্রোগ্রামিং সমস্যা: নাল পয়েন্টার অ্যাক্সেস
  • অপ্রয়োজনীয় কোড: স্থানীয় ভেরিয়েবল কখনই পড়া হয় না
  • অপ্রয়োজনীয় কোড: অপ্রয়োজনীয় নাল চেক
  • অপ্রয়োজনীয় কোড: অপ্রয়োজনীয় castালাই বা 'উদাহরণ'

এবং আরো অনেক.


21
আপভোট তবে কেবলমাত্র মূল পোস্টারটি কোনও কিছু সিরিয়াল করে দেখায় না। যদি পোস্টারটি বলেছিল যে "আমি এই জিনিসটি সিরিয়ালাইজ করছি এবং ..." তবে আপনি তার পরিবর্তে একটি ভোট নামাতে চাইছেন: পি
জন গার্ডনার

3
সত্য - আমি ধরেই নিচ্ছিলাম যে প্রশ্নকারীকে কেবল সতর্ক করা উচিত নয়
ম্যাট বি

14
@ গার্ডনার -> সম্মত! তবে প্রশ্নকর্তা তিনি কেন সতর্ক হতে চান না তা জানতে চান।
জিগজি

8
প্রশ্নকর্তা স্পষ্টতই কেন একটি ইউআইডি হওয়া উচিত সে সম্পর্কে যত্নশীল। সুতরাং কেবল তাকে সতর্কতা অবহেলা করতে বলা হ্রাস করা উচিত।
সিনকিএস

111

serialVersionUIDসিরিয়ালযুক্ত ডেটা সংস্করণে সহায়তা করে। সিরিয়ালকরণের সময় এর মান ডেটা দিয়ে সংরক্ষণ করা হয়। ডি-সিরিয়ালাইজ করার সময়, সিরিয়ালযুক্ত ডেটা কীভাবে বর্তমান কোডের সাথে মিলে যায় তা দেখতে একই সংস্করণটি পরীক্ষা করা হয়।

আপনি যদি আপনার ডেটা সংস্করণ করতে চান তবে আপনি সাধারণত serialVersionUID0 এর সাথে শুরু করেন এবং এটি আপনার শ্রেণীর প্রতিটি কাঠামোগত পরিবর্তনের সাথে সংঘাতবদ্ধ করে যা সিরিয়ালযুক্ত ডেটা পরিবর্তন করে (অস্থায়ী ক্ষেত্রগুলি যুক্ত বা অপসারণ)।

বিল্ট-ইন ডি-সিরিয়ালাইজেশন প্রক্রিয়া ( in.defaultReadObject()) ডেটার পুরানো সংস্করণগুলি থেকে ডি-সিরিয়ালাইজ করতে অস্বীকার করবে। তবে আপনি চাইলে আপনার নিজের রিডঅবজেক্ট () -ফাংশনটি সংজ্ঞায়িত করতে পারেন যা পুরানো ডেটা আবার পড়তে পারে। এর পরে এই কাস্টম কোডটি serialVersionUIDকোন সংস্করণে রয়েছে তা জানার জন্য চেক করতে পারেন এবং কীভাবে এটি ডি-সিরিয়ালাইজ করবেন decide আপনি যদি সিরিয়ালযুক্ত ডেটা সংরক্ষণ করেন যা আপনার কোডের বেশ কয়েকটি সংস্করণে বেঁচে থাকে তবে এই সংস্করণ প্রযুক্তিটি কার্যকর।

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

এই ক্ষেত্রে আপনি পিছনের সামঞ্জস্য বজায় রাখতে আগ্রহী নন। আপনি কেবল তা নিশ্চিত করেই নিশ্চিত হন যে কোড বেজগুলি প্রকৃতপক্ষে যোগাযোগ করছে তা সম্পর্কিত ক্লাসগুলির একই সংস্করণ রয়েছে। এই ধরনের চেকটি সহজ করার জন্য আপনাকে অবশ্যই serialVersionUIDআগের মতোই বজায় রাখতে হবে এবং ক্লাসে পরিবর্তন করার সময় এটি আপডেট করতে ভুলবেন না।

আপনি যদি ক্ষেত্রটি আপডেট করতে ভুলে যান তবে আপনি বিভিন্ন কাঠামোর সাথে ক্লাসের দুটি ভিন্ন সংস্করণ দিয়ে শেষ করতে পারেন serialVersionUID। যদি এটি ঘটে থাকে, ডিফল্ট প্রক্রিয়া ( in.defaultReadObject()) কোনও পার্থক্য সনাক্ত করতে পারে না এবং বেমানান ডেটা ডি-সিরিয়াল করার চেষ্টা করবে। এখন আপনি কোনও ক্রিপ্টিক রানটাইম ত্রুটি বা নীরব ব্যর্থতা (নাল ক্ষেত্র) দিয়ে শেষ করতে পারেন। এই ধরণের ত্রুটিগুলি খুঁজে পাওয়া শক্ত হতে পারে।

সুতরাং এই ব্যবহারের ক্ষেত্রে সাহায্য করার জন্য, জাভা প্ল্যাটফর্ম আপনাকে serialVersionUIDম্যানুয়ালি সেট না করার একটি পছন্দ দেয় । পরিবর্তে, ক্লাস কাঠামোর একটি হ্যাশ সংকলন সময়ে উত্পন্ন এবং আইডি হিসাবে ব্যবহৃত হবে। এই প্রক্রিয়াটি নিশ্চিত করবে যে আপনার একই আইডির সাথে কখনও কখনও বিভিন্ন শ্রেণিবদ্ধ কাঠামো নেই এবং তাই আপনি উপরে উল্লিখিত হার্ড-টু-ট্রেস রানটাইম সিরিয়ালাইজেশন ব্যর্থতাগুলি পাবেন না।

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

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


4
অস্থায়ী ক্ষেত্র যুক্ত করা বা অপসারণ ক্লাস সিরিয়ালাইজেশন-বেমানান করে না। অতএব এই ধরনের পরিবর্তনগুলিতে 'এটিকে ঘর্ষণ' করার কোনও কারণ নেই।
ব্যবহারকারী 207421

4
@ এজেপি: হাহ? ডেটা যুক্ত করা আমার পৃথিবীতে সিরিয়াল ডেটা অবশ্যই স্পষ্টভাবে পরিবর্তন করে।
আলেকজান্ডার টর্সলিং

3
আমি যা লিখেছি তা পাঠান আমি বলিনি যে এটি 'সিরিয়ালের ডেটা পরিবর্তন করে না'। আমি বলেছিলাম এটি 'শ্রেণিকৃত সিরিয়ালাইজেশন-বেমানান করে না'। এটি একই জিনিস নয়। আপনাকে অবজেক্ট সিরিয়ালাইজেশন নির্দিষ্টকরণের সংস্করণ অধ্যায়টি পড়তে হবে।
ব্যবহারকারী 207421

3
@ ইজেপি: আমি বুঝতে পেরেছি যে একটি অস্থায়ী ক্ষেত্র যুক্ত করার অর্থ এই নয় যে আপনি শ্রেণিকৃত সিরিয়ালাইজেশন-বেমানান করেছেন, তবে এটি একটি কাঠামোগত পরিবর্তন যা সিরিয়ালযুক্ত ডেটা পরিবর্তন করে এবং আপনি সাধারণত যখন এটি না করেন তখন সংস্করণটি কাটাতে চান পিছনে সামঞ্জস্যতা হ্যান্ডেল করুন, যা আমি পরে পোস্টেও ব্যাখ্যা করেছি। আপনার বক্তব্য ঠিক কি?
আলেকজান্ডার টর্সলিং

4
আমার বক্তব্যটি আমি যা বলেছিলাম ঠিক তেমনই রয়ে গেছে। অস্থায়ী ক্ষেত্র যুক্ত করা বা অপসারণ করাকে শ্রেণিকরণ সিরিয়ালাইজেশন-বেমানান করে না। অতএব প্রতিবার এটি করার সময় আপনার সিরিয়াল ভার্সনইউইউডিটি টুকরো টুকরো করার দরকার নেই।
ব্যবহারকারীর 207421 11

72

সিরিয়াল ভার্সনইউইউডিটি কী এবং আমি কেন এটি ব্যবহার করব?

SerialVersionUIDপ্রতিটি শ্রেণীর জন্য একটি অনন্য শনাক্তকারী, শ্রেণিটির JVMসংস্করণগুলির তুলনা করতে এটি ব্যবহার করে এটি নিশ্চিত করে যে সিরিয়ালাইজেশন চলাকালীন একই শ্রেণিটি ডিসরিয়ালেসনের সময় লোড হয়েছিল।

একটি নির্দিষ্ট করা আরও নিয়ন্ত্রণ দেয়, যদিও আপনি উল্লেখ না করলে JVM একটি উত্পন্ন করে। উত্পন্ন মান বিভিন্ন সংকলকগুলির মধ্যে পার্থক্য করতে পারে। তদ্ব্যতীত, কখনও কখনও আপনি কেবল কোনও কারণে পুরানো সিরিয়ালাইজড অবজেক্টগুলির deserialization নিষেধ করার জন্য চান [ backward incompatibilityএবং] এই ক্ষেত্রে আপনাকে কেবল সিরিয়াল ভার্সনউইডিএইচ পরিবর্তন করতে হবে।

জন্য javadocsSerializable বলে :

ডিফল্ট সিরিয়াল ভার্সনইউডিউ গণনা ক্লাসের বিবরণে অত্যন্ত সংবেদনশীল যা সংকলক বাস্তবায়নের উপর নির্ভর করে পরিবর্তিত হতে পারে এবং এর ফলে InvalidClassExceptiondeserialization সময় অপ্রত্যাশিত ফলাফল হতে পারে in

অতএব, আপনাকে অবশ্যই সিরিয়াল ভার্সনওইউডিউড ঘোষণা করতে হবে কারণ এটি আমাদের আরও নিয়ন্ত্রণ দেয়

এই নিবন্ধটি বিষয়ে কিছু ভাল পয়েন্ট আছে।


3
@ উইনোথবাবু কিন্তু সিরিয়াল ভার্সনইউডিটি স্থির তাই স্ট্যাটিক ভেরিয়েবলগুলি সিরিয়ালাইজ করা যায় না। তাহলে কীভাবে জেভিএম আসবে সংস্করণটি পরীক্ষা করবে না জেনে ডিসরিয়ালাইজিং অবজেক্টের সংস্করণ কী
ক্রান্তি সামা

3
এই উত্তরে যে জিনিসটি উল্লেখ করা হয়নি তা হ'ল আপনি serialVersionUIDকী কারণে না জেনে অন্ধভাবে অনিচ্ছাকৃত পরিণতি ঘটাতে পারেন । মেট্রোয়েডফ্যান ২০০২ এর উত্তরে টম অ্যান্ডারসনের মন্তব্য এটিকে সম্বোধন করে: "আমি বলব যে আপনি যদি স্থায়ী সঞ্চয়স্থানের জন্য সিরিয়ালাইজেশন ব্যবহার না করে থাকেন তবে আপনার কোনও মান যুক্ত করার পরিবর্তে @ সাপ্রেস ওয়ার্নিংস ব্যবহার করা উচিত the এটি ক্লাসকে কম অস্থির করে তোলে এবং এটি দক্ষতার সংরক্ষণ করে অসামঞ্জস্যপূর্ণ পরিবর্তন থেকে আপনাকে রক্ষা করার জন্য সিরিয়াল ভার্সনিউড মেকানিজম। "
কারবি

7
serialVersionUIDহয় না একটি 'প্রতিটি বর্গ জন্য অনন্য শনাক্তকারী'। পুরোপুরি যোগ্য শ্রেণীর নাম এটি। এটি একটি সংস্করণ সূচক।
ব্যবহারকারী 207421

58

আসল প্রশ্নটি 'কেন এটি গুরুত্বপূর্ণ' এবং 'উদাহরণ' জিজ্ঞাসা করেছে যেখানে এটি কার্যকর Serial Version IDহবে। আমি একটি খুঁজে পেয়েছি।

বলুন আপনি একটি Carশ্রেণি তৈরি করেছেন, তা ইনস্ট্যান্টিয়েট করুন এবং এটি কোনও বস্তুর স্ট্রিমে লিখুন। সমতল গাড়ির বস্তু কিছু সময়ের জন্য ফাইল সিস্টেমে বসে। এদিকে, Carক্লাসটি যদি নতুন ক্ষেত্র যুক্ত করে সংশোধিত হয়। পরবর্তীতে, আপনি যখন সমতল Carবস্তুটি পড়ার (অর্থাত্‍ deserialize) চেষ্টা করার চেষ্টা করেন, তখন আপনি পাবেন java.io.InvalidClassException- কারণ সমস্ত সিরিয়ালাইজযোগ্য ক্লাসগুলি স্বয়ংক্রিয়ভাবে একটি অনন্য শনাক্তকারী দেওয়া হয়। শ্রেণিটির শনাক্তকারী সমতল বস্তুর সনাক্তকারীর সমান না হলে এই ব্যতিক্রম নিক্ষেপ করা হয়। আপনি যদি সত্যিই এটির বিষয়ে চিন্তা করেন তবে নতুন ক্ষেত্র যুক্ত হওয়ার কারণে ব্যতিক্রমটি ছুঁড়ে দেওয়া হবে। আপনি একটি স্পষ্ট সিরিয়াল ভার্সনিউডিউড ঘোষণা করে নিজেকে সংস্করণটিকে নিয়ন্ত্রণ করে এই ব্যতিক্রমটিকে এড়াতে পারবেন। আপনার সাফ জানিয়ে দেওয়ার ক্ষেত্রে একটি ছোট পারফরম্যান্স সুবিধাও রয়েছেserialVersionUID(কারণ গণনা করতে হবে না)। সুতরাং, আপনি নীচে প্রদর্শিত হিসাবে এটি তৈরি করার সাথে সাথেই আপনার সিরিয়ালীয়যোগ্য ক্লাসগুলিতে আপনার নিজস্ব সিরিয়াল ভার্সনইউডিটি যুক্ত করা ভাল অনুশীলন:

public class Car {
    static final long serialVersionUID = 1L; //assign a long value
}

এবং প্রত্যেকের ইউআইডিতে 1L নয়, এলোমেলো দীর্ঘ সংখ্যা নির্ধারণ করা উচিত।
আব্বাস

4
@ আব্বাস 'কারও উচিত' কেন? এটি কী পার্থক্য করে তা ব্যাখ্যা করুন।
ব্যবহারকারী 207421

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

2
@ আব্বাস, এই উদ্দেশ্যটি ক্রমবর্ধমান প্রাকৃতিক সংখ্যা ইত্যাদির ব্যবহারের সাথে সংঘর্ষে নয় 1
ভাদজিম

2
@ বিল্ক, আমি ভেবেছিলাম সিরিয়ালাইজেশন চেকটি ক্লাসের নাম এবং সিরিয়াল ভার্সনিউডের জুটিতে আবদ্ধ। সুতরাং বিভিন্ন ক্লাস এবং লাইব্রেরির বিভিন্ন নম্বর স্কিমগুলি কোনওভাবে হস্তক্ষেপ করতে পারে না। অথবা আপনি কোড উত্পন্ন গ্রন্থাগার বোঝানো হয়েছে?
ভাদজিম

42

প্রথমে আমাকে সিরিয়ালাইজেশন কী তা বোঝাতে হবে।

সিরিয়ালাইজেশন কোনও বস্তুকে নেটওয়ার্কের মাধ্যমে প্রবাহে রূপান্তরিত করতে বা ফাইলটিতে সংরক্ষণ করতে বা অক্ষরে ব্যবহারের জন্য ডিবিতে সংরক্ষণ করতে দেয়।

সিরিয়ালাইজেশনের জন্য কিছু নিয়ম রয়েছে

  • কোনও শ্রেণি বা এর সুপারক্লাস সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করলেই কোনও বস্তু সিরিয়ালাইজযোগ্য

  • কোনও বস্তু সিরিয়ালাইজযোগ্য (নিজেই সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করে) এমনকি তার সুপারক্লাস না থাকলেও। তবে সিরিয়ালাইজযোগ্য শ্রেণির শ্রেণিবিন্যাসের প্রথম সুপারক্লাস, যা সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করে না, অবশ্যই একটি নো-আরগ কনস্ট্রাক্টর থাকতে হবে। যদি এটি লঙ্ঘন করা হয় তবে রিডওবজেক্ট () একটি জাভা.ইও উত্পাদন করবে run

  • সমস্ত আদিম ধরণের সিরিয়ালাইজযোগ্য।

  • ক্ষণস্থায়ী ক্ষেত্রগুলি (ক্ষণস্থায়ী সংশোধক সহ) ক্রমিক নয়, (যেমন, সংরক্ষণ বা পুনরুদ্ধার করা হয়নি)। সিরিয়ালাইজেবল প্রয়োগ করে এমন একটি শ্রেণীর অবশ্যই শ্রেণিবদ্ধের ক্ষণস্থায়ী ক্ষেত্রগুলি চিহ্নিত করতে হবে যা সিরিয়ালাইজেশন সমর্থন করে না (যেমন, একটি ফাইল স্ট্রিম)।

  • স্ট্যাটিক ক্ষেত্রগুলি (স্ট্যাটিক মডিফায়ার সহ) সিরিয়ালযুক্ত হয় না।

যখন Objectধারাবাহিকভাবে হয়, জাভা রানটাইম সিরিয়াল সংস্করণ সংখ্যা ওরফে সঙ্ঘ, serialVersionID

যেখানে আমাদের সিরিয়াল ভার্সনআইডি দরকার: ডিসিরিয়ালেসনের সময় প্রেরক এবং গ্রহীতা সিরিয়ালের জন্য সম্মতিযুক্ত তা যাচাই করতে। যদি রিসিভারটি ক্লাসে আলাদা করে লোড করেserialVersionIDতবে ডেসারিয়ালাইজেশনটি শেষ হবেInvalidClassCastException
সিরিয়ালীকরণযোগ্য শ্রেণীরserialVersionUIDনামserialVersionUIDস্থির, চূড়ান্ত এবং দীর্ঘ প্রকারের হতে হবে এমনএকটি ক্ষেত্রঘোষণা করে নিজেরস্পষ্টরূপে ঘোষণাকরতে পারে।

এর একটি উদাহরণ দিয়ে চেষ্টা করুন।

import java.io.Serializable;    
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String empname;
private byte empage;

public String getEmpName() {
    return name;
}
public void setEmpName(String empname) {
    this.empname = empname;
}
public byte getEmpAge() {
    return empage;
}
public void setEmpAge(byte empage) {
    this.empage = empage;
}

public String whoIsThis() {
    StringBuffer employee = new StringBuffer();
    employee.append(getEmpName()).append(" is ).append(getEmpAge()).append("
years old  "));
    return employee.toString();
}
}

সিরিয়ালাইজ অবজেক্ট তৈরি করুন

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Writer {
public static void main(String[] args) throws IOException {
    Employee employee = new Employee();
    employee.setEmpName("Jagdish");
    employee.setEmpAge((byte) 30);

    FileOutputStream fout = new 
FileOutputStream("/users/Jagdish.vala/employee.obj");
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(employee);
    oos.close();
    System.out.println("Process complete");
}
}

অবজেক্টটি ডিসরিয়ালাইজ করুন

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Reader {
public static void main(String[] args) throws ClassNotFoundException, 
IOException {
    Employee employee = new Employee();
    FileInputStream fin = new 
    FileInputStream("/users/Jagdish.vala/employee.obj");
    ObjectInputStream ois = new ObjectInputStream(fin);
    employee = (Employee) ois.readObject();
    ois.close();
    System.out.println(employee.whoIsThis());
 }
}    

দ্রষ্টব্য: এখন কর্মচারী শ্রেণীর ক্রমিক সংস্করণ পরিবর্তন করুন এবং সংরক্ষণ করুন:

private static final long serialVersionUID = 4L;

এবং রিডার ক্লাসটি কার্যকর করুন। রাইটার ক্লাসটি কার্যকর করতে নয় এবং আপনি ব্যতিক্রম পাবেন।

Exception in thread "main" java.io.InvalidClassException: 
com.jagdish.vala.java.serialVersion.Employee; local class incompatible: 
stream classdesc serialVersionUID = 1, local class serialVersionUID = 4
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.krishantha.sample.java.serialVersion.Reader.main(Reader.java:14)

37

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


10
আপনি যদি অবজেক্টগুলিকে সিরিয়ালাইজ করতে যাচ্ছেন না তবে সেগুলি সিরিয়ালাইজযোগ্য কেন?
এরিকসন

7
@ এরিকসন - অভিভাবক শ্রেণি সিরিয়ালীকরণযোগ্য হতে পারে, বলুন, অ্যারেলিস্ট, তবে আপনি এটি চান যে আপনার নিজস্ব অবজেক্ট (বলুন, একটি পরিবর্তিত অ্যারে তালিকা) এটি বেস হিসাবে ব্যবহার করুন তবে আপনি যে সংগ্রহটি তৈরি করেছেন তা ক্রিয়াকলাপ করতে যাবেন না।
MetroidFan2002

5
এটি জাভা ভাষা নির্দিষ্টকরণের কোথাও উল্লেখ করা হয়নি anywhere এটি অবজেক্ট ভার্সন স্পেসিফিকেশনে উল্লেখ করা হয়েছে।
ব্যবহারকারী 207421


34

আপনি যদি কোনও ক্লাসে এই সতর্কতাটি পান তবে আপনি কখনও সিরিয়ালকরণের কথা ভাবেন না এবং আপনি নিজেই ঘোষণা করেন নি implements Serializable, এটি প্রায়শই কারণ আপনি একটি সুপার ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, যা সিরিয়ালাইজেবল প্রয়োগ করে। প্রায়শই তারপরে উত্তরাধিকার ব্যবহারের পরিবর্তে এই জাতীয় কোনও বিষয়কে অর্পণ করা ভাল।

সুতরাং, পরিবর্তে

public class MyExample extends ArrayList<String> {

    public MyExample() {
        super();
    }
    ...
}

করা

public class MyExample {
    private List<String> myList;

    public MyExample() {
         this.myList = new ArrayList<String>();
    }
    ...
}

এবং সম্পর্কিত পদ্ধতিতে (বা ) এর myList.foo()পরিবর্তে কল করুন । (এটি সব ক্ষেত্রেই খাপ খায় না, তবে এখনও বেশিরভাগ ক্ষেত্রে।)this.foo()super.foo()

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

সতর্কতা (বা সিরিয়াল ভার্সনইউইউডিটি) অনিবার্য নয় এমন একটি ক্ষেত্রে হ'ল আপনি যখন অ্যাবস্ট্রাক্ট অ্যাকশন থেকে প্রসারিত করেন, সাধারণত একটি বেনাম শ্রেণিতে, কেবলমাত্র অ্যাকশনপ্রাপ্ত-পদ্ধতি যুক্ত করে থাকেন। আমি মনে করি এই ক্ষেত্রে কোনও সতর্কতা থাকা উচিত নয় (যেহেতু আপনি সাধারণত আপনার বর্গের বিভিন্ন সংস্করণ জুড়ে যেমন বেনাম শ্রেণিগুলি নির্ভরযোগ্যরূপে সিরিয়ালাইজ করতে এবং ডিজিটালাইজ করতে পারবেন না) তবে আমি নিশ্চিত নই যে সংকলক এটি কীভাবে এটি চিনতে পারে।


4
আমি মনে করি আপনি ঠিক বলেছেন যে ইনহনারিটেন্সের উপরের রচনাটি আরও অর্থবোধ করে, বিশেষত যখন আপনি অ্যারেলিস্টের মতো ক্লাসগুলি নিয়ে আলোচনা করছেন। যাইহোক, অনেকগুলি ফ্রেমওয়ার্কগুলিতে লোকেরা বিমূর্ত সুপারক্লাসগুলি থেকে প্রসারিত হতে পারে যা সিরিয়ালাইজযোগ্য (যেমন স্ট্রুটস ১.২ এর অ্যাকশনফর্ম শ্রেণি, বা স্যাকসনের এক্সটেনশনফিউশনডফিনেশন) সেক্ষেত্রে এই সমাধানটি অনিবার্য। আমি মনে করি আপনি ঠিক বলেছেন, কিছু ক্ষেত্রে সতর্কতাটিকে অগ্রাহ্য করা হলে ভালো হবে (যেমন আপনি যদি কোনও বিমূর্ত সিরিয়ালযোগ্য শ্রেণীর হাত থেকে প্রসারিত হয়ে থাকেন)
পাইপেরা

2
অবশ্যই যদি আপনি কোনও শ্রেণি সদস্য হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়ার পরিবর্তে যোগ করেন তবে আপনাকে সদস্য শ্রেণীর প্রতিটি পদ্ধতির জন্য একটি মোড়ক পদ্ধতি লিখতে হবে যা আপনি ব্যবহার করতে চান, যা এটি একটি বিশাল সংখ্যক পরিস্থিতিতে অপ্রয়োজনীয় করে তুলবে .. ... যদি না জাভা পার্লের মতো কোনও ক্রিয়াকলাপ __AUTOLOADনা করে, যা সম্পর্কে আমি জানি না।
এম_এম

4
@ এম_এম: আপনি যখন আপনার মোড়ানো বস্তুতে প্রচুর পদ্ধতি উপস্থাপন করবেন, অবশ্যই প্রতিনিধিদল ব্যবহার করা উপযুক্ত হবে না। তবে আমি অনুমান করি যে এই কেসটি কোনও ডিজাইনের ভুলের লক্ষণ - আপনার শ্রেণীর ব্যবহারকারীদের (যেমন "মাইনগুই") মোড়ানো বস্তুর (যেমন জে ফ্রেম) প্রচুর পদ্ধতিতে কল করার দরকার নেই।
পাওলো ইবারম্যান

1
প্রতিনিধিদের সম্পর্কে আমি যা পছন্দ করি না তা হ'ল প্রতিনিধিটির একটি রেফারেন্স রাখা দরকার। এবং প্রতিটি রেফারেন্স মানে আরও মেমরি। আমি ভুল হলে শুধরে. আমার যদি 100 টি অবজেক্টের কাস্টমাইজডআরলিলিস্টের প্রয়োজন হয় তবে এটি বেশি গুরুত্ব পাবে না তবে যদি আমার কয়েকটি অবজেক্টের কয়েকশ কাস্টমাইজডিআরলিলিস্ট দরকার হয় তবে মেমরির ব্যবহার উল্লেখযোগ্যভাবে বৃদ্ধি পায়।
ডাব্লুভ্রোক

2
নিক্ষেপযোগ্য সিরিয়ালাইজযোগ্য, এবং কেবল থ্রোয়েবল থ্রয়েবল হতে পারে, সুতরাং এটির ব্যতিক্রম সংজ্ঞা দেওয়া সম্ভব নয় যা সিরিয়ালাইজযোগ্য নয়। প্রতিনিধিদল সম্ভব নয়।
ফিল

22

ক্ষেত্রের সিরিয়াল ভার্সনইউইউডিউউটির তাত্পর্যটি বোঝার জন্য, একজনকে বুঝতে হবে যে সিরিয়ালাইজেশন / ডিসিরিয়ালাইজেশন কীভাবে কাজ করে।

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

সুতরাং আমরা এই সিদ্ধান্তে পৌঁছেছি যে সিরিয়ালাইজেশন / ডেসারিয়ালাইজেশন প্রক্রিয়াটিকে সফল করতে সিরিয়ালাইজড অবজেক্টের সিরিয়াল ভার্সনইউডিটি অবশ্যই শ্রেণীর সিরিয়াল ভার্সনিউডিউডের সমতুল্য। যদি প্রোগ্রামার প্রোগ্রামটিতে সিরিয়াল ভার্সনিউডিউ মানটি স্পষ্টভাবে নির্দিষ্ট করে তবে একই মানটি সিরিয়ালযুক্ত বস্তু এবং শ্রেণীর সাথে সম্পর্কিত হবে, নির্বিশেষে সিরিয়ালাইজেশন এবং ডিেসরিয়ালাইজেশন প্ল্যাটফর্ম নির্বিশেষে (উদাহরণস্বরূপ সিরিয়ালাইজেশন উইন্ডোজের মতো প্ল্যাটফর্মে সূর্য ব্যবহার করে বা প্ল্যাটফর্মে করা যেতে পারে) এমএস জেভিএম এবং ডেসারালাইজেশন জিং জেভিএম ব্যবহার করে বিভিন্ন প্ল্যাটফর্ম লিনাক্সে থাকতে পারে)।

তবে যদি সিরিয়াল ভার্সনইউডিউ প্রোগ্রামার দ্বারা নির্দিষ্ট না করা থাকে তবে সিরিয়ালাইজেশন any কোনও বস্তুর ডি-সিরিয়ালাইজেশন করার সময়, জাভা রানটাইম এটি গণনা করার জন্য তার নিজস্ব অ্যালগরিদম ব্যবহার করে। এই সিরিয়াল ভার্সনইউডিউ গণনা অ্যালগরিদম এক জেআরই থেকে অন্য জেআর-এ পরিবর্তিত হয়। এটিও সম্ভব যে অবজেক্টটি সিরিয়ালাইজ করা হয়েছে এমন পরিবেশের জন্য একটি জেআরই (উদা: সান জেভিএম) ব্যবহার করা হচ্ছে এবং যেখানে পরিবেশে ডিসিরিয়ালাইজেশন হয় লিনাক্স জেভিএম (জিং) ব্যবহার করছে। এই জাতীয় ক্ষেত্রে সিরিয়ালাইজড অবজেক্টের সাথে সম্পর্কিত সিরিয়াল ভার্সনইউডিউ ডিসরিয়ালাইজেশন পরিবেশে গণনা করা ক্লাসের সিরিয়াল ভার্সনিউডের চেয়ে আলাদা হবে। পরিবর্তে deserialization সফল হবে না। সুতরাং এই জাতীয় পরিস্থিতি / সমস্যাগুলি এড়ানোর জন্য প্রোগ্রামারকে অবশ্যই সর্বদা সিরিয়ালাইজেবল বর্গের ক্রমিক সংস্করণ নির্দিষ্ট করতে হবে।


2
অ্যালগরিদম আলাদা হয় না, তবে এটি সামান্য নীচে নির্দিষ্ট করা হয়।
ব্যবহারকারী 207421

... অ্যালগরিদম আলাদা হয় না, তবে এটি সামান্য নীচে নির্দিষ্ট করা হয় ... মানে যে কোনও জেভিএম পরিবর্তিত হতে পারে ..... @ ব্যবহারকারী 207421
অ্যান্টনি

18

বিরক্ত করবেন না, 99,9999% ক্ষেত্রে ডিফল্ট গণনাটি সত্যই যথেষ্ট এবং যথেষ্ট। এবং যদি আপনি সমস্যায় পড়ে থাকেন তবে আপনি - যেমন ইতিমধ্যে বলা হয়েছে - ইউআইডি'র প্রয়োজনীয়তা হিসাবে পরিচয় করিয়ে দিতে পারেন (যা অত্যন্ত সম্ভাব্য নয়)


2
আবর্জনা। ক্লাস পরিবর্তন হয়নি এমন ক্ষেত্রে এটি পর্যাপ্ত। '99 .9999% 'সমর্থন করার জন্য আপনার কাছে শূন্য প্রমাণ রয়েছে।
ব্যবহারকারী 207421

18

উদাহরণস্বরূপ যেখানে অনুপস্থিত সিরিয়াল ভার্সনইউডিউ সমস্যার কারণ হতে পারে:

আমি এই জাভা EE অ্যাপ্লিকেশনটিতে কাজ করছি যা একটি EJBমডিউল ব্যবহার করে এমন একটি ওয়েব মডিউল নিয়ে গঠিত । ওয়েব মডিউলটি EJBমডিউলটিকে দূর থেকে কল করে এবং POJOএটি Serializableএকটি আর্গুমেন্ট হিসাবে কার্যকর করে ।

এই POJO'sক্লাসটি ইজেবি জারের ভিতরে এবং ওয়েব মডিউলের ডাব্লুইউ-আইএনএফ / লিবের নিজস্ব জারের ভিতরে প্যাকেজ করা হয়েছিল। তারা আসলে একই শ্রেণি, তবে আমি যখন ইজেবি মডিউলটি প্যাকেজ করি তখন আমি এই পোজোর জারটি এজেবি মডিউলটির সাথে একত্রে প্যাক করতে আনপ্যাক করি।

EJBনীচের ব্যতিক্রমটির সাথে কলটি ব্যর্থ হয়েছিল কারণ আমি এটি ঘোষণা করি নি serialVersionUID:

Caused by: java.io.IOException: Mismatched serialization UIDs : Source
 (Rep.
 IDRMI:com.hordine.pedra.softbudget.domain.Budget:5CF7CE11E6810A36:04A3FEBED5DA4588)
 = 04A3FEBED5DA4588 whereas Target (Rep. ID RMI:com.hordine.pedra.softbudget.domain.Budget:7AF5ED7A7CFDFF31:6227F23FA74A9A52)
 = 6227F23FA74A9A52

16

আমি সাধারণত serialVersionUIDএকটি প্রসঙ্গে ব্যবহার করি : যখন আমি জানি এটি জাভা ভিএম এর প্রসঙ্গটি ছাড়বে।

আমি কখন এটি ব্যবহার করব ObjectInputStreamএবং ObjectOutputStreamআমার অ্যাপ্লিকেশনটির জন্য জানতাম বা যদি আমি কোনও লাইব্রেরি / কাঠামো জানি তবে এটি ব্যবহার করবে। সিরিয়াল ভার্সনআইডি নিশ্চিত করে যে বিভিন্ন জাভা ভিএমএসের বিভিন্ন সংস্করণ বা বিক্রেতারা সঠিকভাবে ইন্টার-অপারেটিং করবে বা যদি এটি ভিএম এর বাইরে সঞ্চিত এবং পুনরুদ্ধার করা হয় উদাহরণস্বরূপ HttpSessionসেশন ডেটা অ্যাপ্লিকেশন সার্ভার পুনরায় আরম্ভ এবং আপগ্রেড করার সময়ও থাকতে পারে।

অন্যান্য সমস্ত ক্ষেত্রে, আমি ব্যবহার করি

@SuppressWarnings("serial")

বেশিরভাগ সময় ডিফল্টই serialVersionUIDযথেষ্ট। এর মধ্যে রয়েছে Exception, HttpServlet


এটি এমন পাত্রে HTTP সার্ভলেট অন্তর্ভুক্ত করে না যেখানে সেগুলি সরিয়ে নেওয়া যেতে পারে, বা উদাহরণস্বরূপ আরএমআই-তে ব্যতিক্রম।
ব্যবহারকারী 207421

14

ফিল্ড ডেটা ক্লাসে সঞ্চিত কিছু তথ্য উপস্থাপন করে। শ্রেণি Serializableইন্টারফেস প্রয়োগ করে , তাই গ্রহটি স্বয়ংক্রিয়ভাবে serialVersionUIDক্ষেত্রটি ঘোষণার প্রস্তাব দেয় । সেখানে মান 1 সেট দিয়ে শুরু করা যাক।

আপনি যদি সেই সতর্কতা আসতে না চান তবে এটি ব্যবহার করুন:

@SuppressWarnings("serial")

11

চেকস্টাইল যাচাই করতে পারত যদি সিরিয়ালাইজেবল প্রয়োগ করে এমন একটি শ্রেণীর উপরের সিরিয়াল ভার্সনইউডির ভাল মান রয়েছে, অর্থাত এটি সিরিয়াল সংস্করণ আইডি জেনারেটরের উত্পাদনের সাথে মেলে। আপনার যদি প্রচুর সিরিয়ালযোগ্য ডিটিও সহ একটি প্রকল্প থাকে, উদাহরণস্বরূপ, বিদ্যমান সিরিয়াল ভার্সনউইডিএফটি মুছে ফেলা এবং এটি পুনরুত্পাদন করা মনে রাখা একটি ব্যথা এবং বর্তমানে এটি যাচাই করার একমাত্র উপায় (যা আমি জানি) প্রতিটি শ্রেণীর জন্য পুনর্জন্ম এবং তুলনা করা পুরানোটি. এটি খুব বেদনাদায়ক।


8
যদি আপনি জেনারেটর উত্পন্ন করে একই মান হিসাবে সিরিয়াল ভার্সনউইউডিউড সেট করে থাকেন তবে আপনার সত্যিই একেবারেই প্রয়োজন নেই। সর্বোপরি, ক্লাসটি এখনও সামঞ্জস্যপূর্ণ যখন পরিবর্তিত হওয়ার পরে তার রেসন ডি'ট্রে একই রকম থাকবে।
পাওলো ইবারম্যান

4
কারণটি তাই বিভিন্ন সংকলক একই শ্রেণীর জন্য একই মান নিয়ে আসে। জাভাডোকস (যেমন উপরেও জবাব দেওয়া হয়েছে) হিসাবে ব্যাখ্যা করা হয়েছে, উত্পন্ন সংস্করণ ভঙ্গুর এবং শ্রেণিটি সঠিকভাবে বিচ্যুত হওয়ার পরেও পরিবর্তিত হতে পারে। যতক্ষণ আপনি প্রতিবার একই সংকলকটিতে এই পরীক্ষা চালাবেন ততক্ষণ এটি নিরাপদ হওয়া উচিত। আপনি কোডটি পরিবর্তন না করলেও আপনি জেডিকে আপগ্রেড করেন এবং একটি নতুন নিয়ম প্রকাশিত হয় তবে godশ্বর আপনাকে সাহায্য করুন।
অ্যান্ড্রু ব্যাকার

2
এটি কী serialverউত্পাদন করবে তা মিলানোর প্রয়োজন নেই। -1
ব্যবহারকারী 207421

সাধারণভাবে এটি মোটেই প্রয়োজন হয় না। @ অ্যান্ড্রুব্যাকারের ক্ষেত্রে একই। জাভা ফাইলে দুটি পৃথক সংকলক প্রয়োজন the যদি এটি হয়, তবে কোনও এসইউডি না থাকা ভাল কাজ করবে।
বিল কে

1
যে লোকেরা সত্যই স্টোরেজ / পুনরুদ্ধারের উদ্দেশ্যে সিরিয়ালাইজেশন ব্যবহার করে তারা সাধারণত 1 এ সেট করে serialVersionUIDthe শ্রেণীর কোনও নতুন সংস্করণ যদি বেমানান হয় তবে তবুও পুরানো ডেটা হ্যান্ডেল করতে সক্ষম হওয়া দরকার, আপনি সংস্করণ নম্বরটি বাড়িয়ে নিন এবং এতে বিশেষ কোড যুক্ত করবেন পুরানো ফর্ম্যাট সঙ্গে ডিল। আমি প্রতিবার serialVersionUID1 টিরও বেশি সংখ্যক দেখতে দেখতে কান্নাকাটি করি , কারণ এটি একটি এলোমেলো সংখ্যা (অকেজো) বা শ্রেণিটি দৃশ্যত 10 টিরও বেশি বিভিন্ন সংস্করণ নিয়ে কাজ করার প্রয়োজন ছিল।
john16384

11

সিরিয়াল ভার্সনিউডিউড অবজেক্টের সংস্করণ নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। আপনি নিজের ক্লাস ফাইলে সিরিয়াল ভার্সনওয়েড নির্দিষ্ট করতে পারেন। সিরিয়াল ভার্সনিউডিউড নির্দিষ্ট না করার ফলাফল হ'ল আপনি যখন ক্লাসে কোনও ক্ষেত্র যুক্ত বা পরিবর্তন করেন তখন ইতিমধ্যে সিরিয়ালযুক্ত শ্রেণি পুনরুদ্ধার করতে পারবেন না কারণ নতুন শ্রেণীর জন্য এবং পুরানো সিরিয়ালাইজড অবজেক্টের জন্য তৈরি সিরিয়াল ভার্সনইউড আলাদা হবে। জাভা সিরিয়ালাইজেশন প্রক্রিয়া সিরিয়ালযুক্ত বস্তুর অবস্থা পুনরুদ্ধারের জন্য সঠিক সিরিয়াল ভার্সনইউডিউউডের উপর নির্ভর করে এবং java.io নিক্ষেপ করে th

আরও পড়ুন: http://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html#ixzz3VQxnpOPZ


9

জাভাতে ক্লাসের SerialVersionUIDভিতরে কেন ব্যবহার করবেন Serializable?

সময়কালে serialization, জাভা রানটাইম কোনও শ্রেণীর জন্য একটি সংস্করণ নম্বর তৈরি করে, যাতে এটি পরে এটি ডি-সিরিয়ালাইজ করতে পারে। এই সংস্করণ নম্বরটি SerialVersionUIDজাভা হিসাবে পরিচিত ।

SerialVersionUIDসিরিয়ালযুক্ত ডেটা সংস্করণে ব্যবহৃত হয়। আপনি কেবলমাত্র কোনও শ্রেণিকে ডি-সিরিয়ালাইজ করতে পারবেন যদি এটি SerialVersionUIDসিরিয়ালযুক্ত উদাহরণের সাথে মেলে। যখন আমরা SerialVersionUIDআমাদের ক্লাসে ঘোষণা করি না , জাভা রানটাইম আমাদের জন্য এটি তৈরি করে তবে এটি প্রস্তাবিত নয়। এটি ডিফল্ট প্রক্রিয়া এড়ানোর জন্য ভেরিয়েবল SerialVersionUIDহিসাবে ঘোষণা করার প্রস্তাব দেওয়া হয় private static final long

আপনি যখন Serializableমার্কার ইন্টারফেস প্রয়োগ করে শ্রেণি ঘোষণা করেন java.io.Serializable, তখন জাভা রানটাইম ডিফল্ট সিরিয়ালাইজেশন প্রক্রিয়া ব্যবহার করে ডিস্কে সেই শ্রেণীর নজির বজায় রাখে, তবে আপনি যদি Externalizableইন্টারফেস ব্যবহার করে প্রক্রিয়াটি অনুকূলিত না করেন ।

আরো দেখুন কেন ব্যবহার জাভা ভিতরে Serializable বর্গ SerialVersionUID

কোড: জাভাসিস্ট.সিরিয়াল ভার্শনিউড


8

যদি আপনি প্রচুর ক্লাস সংশোধন করতে চান যা পুরানো শ্রেণীর সাথে সামঞ্জস্য বজায় রেখে প্রথম স্থানে কোনও সিরিয়াল ভার্সনিউডিউড সেট না করে, ইন্টেলিজ আইডিয়া, ইলেপিসের মতো সরঞ্জামগুলি এলোমেলো সংখ্যার উত্স তৈরি করার কারণে খুব কম হয়ে যায় এবং একগুচ্ছ ফাইলের কাজ করে না একজনের ভিতরে প্রবেশ. সিরিয়ালের ভার্সনউইউডিটি ইস্যুটি সহজেই সংশোধন করার জন্য আমি নীচের বাশ স্ক্রিপ্টটি (উইন্ডোজ ব্যবহারকারীদের জন্য আমি দুঃখিত, একটি ম্যাক কিনে বিবেচনা করুন বা লিনাক্সে রূপান্তর করতে বিবেচনা করুন):

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 বলুন ~ / বিন। তারপরে আপনি এটিকে আপনার মাভেন বা গ্রেডেল প্রকল্পের মূল ডিরেক্টরিতে চালান:

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

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


2
আমাকে একটি ধারণা দেয়: সদৃশ সংস্করণ uidকে এই জাতীয় কোনও সরঞ্জাম দিয়ে পুনরায় জেনারেট করুন, হাত ছাড়া কখনও প্রকাশের আগে - এইভাবে, আপনি এমন একটি শ্রেণিতে পরিবর্তন করতে ভুলে যাবেন না যাঁর ক্রমিক সংস্করণ ইউআইডি সত্যিকারের কারণে পরিবর্তন হওয়া উচিত বেমানান পরিবর্তন। ম্যানুয়ালি সেই ট্র্যাক রাখা খুব কঠিন।
ইগনাজিও

6

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

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

শ্রেণিটি সিরিয়ালযোগ্য হলে আপনি "সিরিয়ালভিশনিউইউএনডি" নামক একটি ক্ষেত্রকে স্পষ্ট করে ঘোষিত করে নিজের নিজস্ব সিরিয়ালভিউশনইউডিও ঘোষণা করতে পারেন যা অবশ্যই স্থির, চূড়ান্ত এবং টাইপ দীর্ঘ। Eclipse এর মতো বেশিরভাগ IDE আপনাকে সেই দীর্ঘ স্ট্রিং তৈরি করতে সহায়তা করে।


6

প্রতিবার যখন কোনও বস্তুটি সিরিয়ালযুক্ত হয় তখন অবজেক্টটির শ্রেণীর জন্য সংস্করণ আইডি নম্বর দিয়ে স্ট্যাম্প করা হয় his এই আইডিটিকে সিরিয়াল ভার্সনিউইউডিডি বলা হয় এবং এটি শ্রেণি কাঠামো সম্পর্কিত তথ্যের ভিত্তিতে গণনা করা হয়। মনে করুন আপনি একটি কর্মচারী শ্রেণি তৈরি করেছেন এবং এর সংস্করণ আইডি # 333 (জেভিএম দ্বারা নির্ধারিত) রয়েছে, এখন আপনি যখন সেই শ্রেণীর অবজেক্টটি সিরিয়ালাইজ করবেন (ধরুন কর্মচারী বস্তু), জেভিএম এটিতে # 333 হিসাবে ইউআইডি বরাদ্দ করবে।

একটি পরিস্থিতি বিবেচনা করুন - ভবিষ্যতে আপনাকে আপনার শ্রেণিটি সম্পাদনা বা পরিবর্তন করতে হবে এবং সেক্ষেত্রে আপনি যখন এটি সংশোধন করবেন, জেভিএম এটিকে একটি নতুন ইউআইডি বরাদ্দ করবে (ধরুন # 444)। এখন আপনি যখন কর্মচারী অবজেক্টটি ডিসিরিয়ালাইজ করার চেষ্টা করবেন, জেভিএম ক্লাসের সাথে ক্রমিকের সাথে # 444 (যেহেতু এটি পরিবর্তন করা হয়েছিল) সাথে সিরিয়ালযুক্ত অবজেক্টের (কর্মচারী অবজেক্ট) সংস্করণ আইডি (# 333) তুলনা করবে। তুলনা করলে জেভিএম উভয় সংস্করণ ইউআইডি পৃথক করবে এবং তাই ডেসারাইজেশন ব্যর্থ হবে। সুতরাং যদি প্রতিটি শ্রেণীর জন্য সিরিয়াল ভার্সনআইডি প্রোগ্রামার নিজেই সংজ্ঞায়িত হয়। ভবিষ্যতে শ্রেণিটি বিবর্তিত হয়ে থাকলেও এটি একই হবে এবং তাই জেভিএম সর্বদা দেখতে পাবে যে শ্রেণিটি পরিবর্তিত হলেও শ্রেণিকৃত বস্তুর সাথে সামঞ্জস্যপূর্ণ। আরও তথ্যের জন্য আপনি হেড প্রথম জাভা এর 14 অধ্যায়টি উল্লেখ করতে পারেন।


1
প্রতিবার যখন কোনও বস্তুর শ্রেণি সিরিয়াল করা হয় তখন serialVersionUIDতা সঞ্চারিত হয়। এটি প্রতিটি বস্তুর সাথে পাঠানো হয় না।
ব্যবহারকারী 207421

3

একটি সাধারণ ব্যাখ্যা:

  1. আপনি কি ডেটা সিরিয়ালাইজ করছেন?

    সিরিয়ালাইজেশন মূলত কোনও ফাইল / স্ট্রিম / ইত্যাদিতে শ্রেণি ডেটা লিখতে হয়। ডি-সিরিয়ালাইজেশনটি কোনও ক্লাসে ফিরে সেই ডেটা পড়ছে।

  2. আপনি কি প্রযোজনায় যেতে চান?

    যদি আপনি কেবল গুরুত্বহীন / জাল ডেটা দিয়ে কিছু পরীক্ষা করে দেখেন তবে তা নিয়ে চিন্তা করবেন না (যদি না আপনি সরাসরি সিরিয়ালাইজেশন পরীক্ষা করেন)।

  3. এটি কি প্রথম সংস্করণ?

    যদি তাই হয়, সেট করুন serialVersionUID=1L

  4. এটি কি দ্বিতীয়, তৃতীয় ইত্যাদি প্রোড সংস্করণ?

    এখন আপনাকে চিন্তিত serialVersionUIDহওয়া উচিত এবং এটিকে গভীরতার সাথে দেখা উচিত।

মূলত, আপনি যখন ক্লাসটি আপডেট / লেখার দরকার পড়েন তখন আপনি সংস্করণটি সঠিকভাবে আপডেট না করেন, আপনি পুরানো ডেটা পড়ার চেষ্টা করার সময় একটি ত্রুটি পাবেন।


2

'সিরিয়াল ভার্সনিউইউডিইউ' একটি bit৪ বিট নম্বর যা ডিসরিয়ালাইজেশন প্রক্রিয়া চলাকালীন কোনও শ্রেণিকে অনন্যভাবে চিহ্নিত করতে ব্যবহৃত হয়। আপনি যখন কোনও অবজেক্টকে সিরিয়ালাইজ করবেন তখন ক্লাসের সিরিয়াল ভার্সনইউডিও ফাইলটিতে লেখা আছে। আপনি যখনই এই অবজেক্টটিকে ডিসিরিয়ালাইজ করবেন, জাভা রান টাইম সিরিয়ালযুক্ত ডেটা থেকে এই সিরিয়াল ভার্সনিউডিউ মানটি বের করে এবং ক্লাসের সাথে একই মানের সহযোগীর তুলনা করবে। যদি উভয়ই মেলে না, তবে 'java.io.InuthorClassException' নিক্ষেপ করা হবে।

যদি সিরিয়ালাইজযোগ্য ক্লাসটি স্পষ্টরূপে সিরিয়াল ভার্সনিউডিউড ঘোষণা না করে, তবে সিরিয়ালাইজেশন রানটাইম ক্ষেত্র, পদ্ধতি ইত্যাদির উপর ভিত্তি করে শ্রেণীর বিভিন্ন দিকের ভিত্তিতে সেই শ্রেণীর জন্য সিরিয়াল ভার্সনউইড মান গণনা করবে, আপনি ডেমো প্রয়োগের জন্য এই লিঙ্কটি উল্লেখ করতে পারেন ।


1

দীর্ঘ গল্প সংক্ষিপ্ত বলতে এই ক্ষেত্রটি সিরিয়ালযুক্ত ডেটা সঠিকভাবে ডিসেরায়ালাইজড করা যায় কিনা তা পরীক্ষা করতে ব্যবহৃত হয়। সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন প্রায়শই প্রোগ্রামের বিভিন্ন অনুলিপি দ্বারা তৈরি করা হয় - উদাহরণস্বরূপ সার্ভার বস্তুকে স্ট্রিংয়ে রূপান্তর করে এবং ক্লায়েন্ট প্রাপ্ত প্রাপ্ত স্ট্রিংকে অবজেক্টে রূপান্তর করে। এই ক্ষেত্রটি বলে যে উভয়ই এই বস্তুটি কী তা সম্পর্কে একই ধারণা নিয়ে কাজ করে। এই ক্ষেত্র সাহায্য করে যখন:

  • আপনার প্রোগ্রামের বিভিন্ন জায়গায় বিভিন্ন স্থানে রয়েছে (যেমন 1 সার্ভার এবং 100 ক্লায়েন্ট)। আপনি যদি নিজের অবজেক্ট পরিবর্তন করেন, আপনার সংস্করণ নম্বরটি পরিবর্তন করেন এবং এই ক্লায়েন্টদের একটি আপডেট করতে ভুলে যান, তবে তা জেনে রাখা হবে যে তিনি deserialization করতে সক্ষম নন

  • আপনি কোনও ফাইলটিতে আপনার ডেটা সংরক্ষণ করেছেন এবং পরে এটি আপনার প্রোগ্রামের আপডেট সংস্করণ দিয়ে পরিবর্তিত বস্তু সহ খোলার চেষ্টা করেছেন - আপনি জানবেন যে আপনি যদি নিজের সংস্করণটি ঠিক রাখেন তবে এই ফাইলটি সামঞ্জস্যপূর্ণ নয়

এটা কখন গুরুত্বপূর্ণ?

সর্বাধিক সুস্পষ্ট - আপনি যদি নিজের অবজেক্টে কিছু ক্ষেত্র যুক্ত করেন তবে পুরানো সংস্করণগুলি সেগুলি ব্যবহার করতে সক্ষম হবে না কারণ তাদের বস্তুর কাঠামোতে এই ক্ষেত্রগুলি নেই।

কম সুস্পষ্ট - আপনি যখন অবজেক্টকে ডিসরিয়ালাইজ করবেন তখন ক্ষেত্রগুলি যেখানে স্ট্রিংয়ে উপস্থিত নেই সেগুলি NULL হিসাবে রাখা হবে। যদি আপনি আপনার বস্তু থেকে ক্ষেত্রটি সরিয়ে ফেলে থাকেন তবে পুরানো সংস্করণগুলি এই ক্ষেত্রটিকে সর্বদাই-নূলে রাখবে যা পুরানো সংস্করণগুলি এই ক্ষেত্রে ডেটার উপর নির্ভর করে যদি তা খারাপ আচরণের দিকে পরিচালিত করতে পারে (যাইহোক আপনি কেবল এটি বিনোদনের জন্য নয়, কোনও কিছুর জন্য এটি তৈরি করেছেন :-))

স্বল্পতম সুস্পষ্ট - কখনও কখনও আপনি কোনও ক্ষেত্রের অর্থ রেখেছিলেন এমন ধারণাটি পরিবর্তন করেন। উদাহরণস্বরূপ আপনি যখন 12 বছর বয়সী হবেন তখন আপনি "বাইক" এর নীচে "সাইকেল" বোঝান, তবে আপনি 18 বছর বয়সের সময় "মোটরসাইকেল" বলতে বোঝাচ্ছেন - যদি আপনার বন্ধুরা আপনাকে "শহর জুড়ে বাইক চালানোর জন্য" আমন্ত্রণ জানায় এবং আপনিই একমাত্র সেই ব্যক্তি হবেন সাইকেলে এসেছিলেন, আপনি ক্ষেত্রজুড়ে একই অর্থ রাখা কতটা গুরুত্বপূর্ণ তা আপনি ছাড়িয়ে যাবেন :-)


1

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

সিরিয়ালাইজেশন: আমরা প্রায়শই গুরুত্বপূর্ণ অবজেক্টের সাথে কাজ করি যার স্টেট (অবজেক্টের ভেরিয়েবলের ডেটা) এত গুরুত্বপূর্ণ যে আমরা পাওয়ার / সিস্টেম ব্যর্থতার কারণে (বা) নেটওয়ার্ক ব্যর্থতার কারণে অবজেক্টের স্টেটকে অন্যটিতে প্রেরণ করার ক্ষেত্রে এটি হারাতে ঝুঁকি নিতে পারি না can মেশিন। এই সমস্যার সমাধানটির নাম দেওয়া হয়েছে "দৃistence়তা" যার অর্থ সহজভাবে ডেটা রাখা (রাখা / সংরক্ষণ করা)। ধারাবাহিকতা হ'ল অধ্যবসায় অর্জনের আরও অনেকগুলি উপায় (ডিস্ক / স্মৃতিতে ডেটা সংরক্ষণ করে)। অবজেক্টের অবস্থা সংরক্ষণ করার সময়, অবজেক্টের জন্য একটি পরিচয় তৈরি করা গুরুত্বপূর্ণ, এটি সঠিকভাবে পিছনে পড়তে সক্ষম হতে (ডি-সিরিয়ালাইজেশন)। এই অনন্য পরিচয়টি আইডি হ'ল সিরিয়াল ভার্সনিউডিউড।


0

সিরিয়াল ভার্সনওয়েড কী? উত্তর: - বলুন এখানে দু'জন ব্যক্তি রয়েছেন, একজন সদর দফতর থেকে এবং অপর একজন ওডিসি থেকে, দুজনেই যথাক্রমে সিরিয়ালাইজেশন এবং deserialization সম্পাদন করতে যাচ্ছেন। এই ক্ষেত্রে ওসিডিতে যে রিসিভারটি সত্যায়িত ব্যক্তি তা প্রমাণীকরণের জন্য, জেভিএম একটি অনন্য আইডি তৈরি করে যা সিরিয়াল ভার্সনইউইডিআইডি হিসাবে পরিচিত।

এখানে দৃশ্যের উপর ভিত্তি করে একটি দুর্দান্ত ব্যাখ্যা দেওয়া হয়েছে,

সিরিয়াল ভার্সনইউড কেন?

সিরিয়ালাইজেশন : সিরিয়ালাইজেশনের সময়, প্রতিটি অবজেক্ট প্রেরকের পাশে জেভিএম একটি অনন্য পরিচয়দাতা সংরক্ষণ করবে। প্রেরক সিস্টেমের মধ্যে উপস্থিত .class ফাইলের ভিত্তিতে যে অনন্য আইডি তৈরি করতে জেভিএম দায়বদ্ধ।

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

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