জাভাতে সিরিয়ালাইজেবল এবং এক্সটার্নালাইজেবলের মধ্যে পার্থক্য কী?


উত্তর:


267

অন্যান্য উত্তরগুলিতে যোগ করার জন্য, প্রয়োগ করে java.io.Serializableআপনি আপনার শ্রেণীর অবজেক্টের জন্য "স্বয়ংক্রিয়" সিরিয়ালাইজেশন ক্ষমতা পাবেন। অন্য কোনও যুক্তি বাস্তবায়নের দরকার নেই, এটি কেবল কাজ করবে। জাভা রানটাইম কীভাবে আপনার জিনিসগুলি মার্শাল এবং আনমারশাল করতে পারে তা নির্ধারণ করতে প্রতিবিম্ব ব্যবহার করবে।

জাভার পূর্ববর্তী সংস্করণে প্রতিফলন খুব ধীর ছিল, এবং তাই বৃহত অবজেক্ট গ্রাফগুলিকে সিরিয়ালাইজ করা (যেমন ক্লায়েন্ট-সার্ভার আরএমআই অ্যাপ্লিকেশনগুলিতে) কিছুটা পারফরম্যান্স সমস্যা ছিল। এই পরিস্থিতিটি পরিচালনা করার java.io.Externalizableজন্য, ইন্টারফেসটি সরবরাহ করা হয়েছিল, যা java.io.Serializableমার্শেলিং এবং আনমারশেলিং ফাংশনগুলি সম্পাদন করার জন্য কাস্টম-লিখিত পদ্ধতিগুলির সাথে ( আপনার ক্লাসে আপনার প্রয়োগ readExternalএবং writeExternalপদ্ধতিগুলি প্রয়োজন) like এটি আপনাকে প্রতিবিম্ব কর্মক্ষমতা বাধা অতিক্রম করার উপায় দেয়।

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

এছাড়াও, অন্তর্নির্মিত জাভা সিরিয়ালাইজেশন প্রক্রিয়াটি কেবলমাত্র একটিই নয়, আপনি তৃতীয় পক্ষের প্রতিস্থাপন যেমন জেবস সিরিয়ালাইজেশন পেতে পারেন যা যথেষ্ট দ্রুত এবং এটি ডিফল্টর জন্য একটি ড্রপ-ইন প্রতিস্থাপন।

একটি বড় Externalizableক্ষয়ক্ষতি হ'ল আপনাকে এই যুক্তিটি নিজেই বজায় রাখতে হবে - আপনি যদি নিজের ক্লাসে কোনও ক্ষেত্র যুক্ত করেন, সরিয়ে ফেলেন বা পরিবর্তন করেন তবে আপনাকে অ্যাকাউন্ট writeExternal/ readExternalঅ্যাকাউন্টগুলি পরিবর্তন করতে হবে।

সংক্ষেপে, Externalizableজাভা 1.1 দিনের একটি প্রতীক। এটির আর আর দরকার নেই।


61
এই মানদণ্ড অনুসারে নয়: [কোড. google.com/p/thrift-protobuf-compare/wiki/Benchmarking] , ম্যানুয়াল সিরিয়ালাইজেশন (এক্সটার্নাইজেবল ব্যবহার করা) জাভা এর ডিফল্ট সিরিয়ালাইজেশন ব্যবহারের চেয়ে অনেক বেশি দ্রুত। যদি গতি আপনার কাজের জন্য গুরুত্বপূর্ণ হয় তবে অবশ্যই নিজের সিরিয়ালাইজারটি লিখুন।
volni

6
নতুন লিঙ্ক আপডেট github.com/eishay/jvm-serializers/wiki @Jack দ্বারা প্রস্তাবিত
noquery

3
Github.com/eishay/jvm-serialization/wiki এর "জাভা-ম্যানুয়াল" বহিরাগতকে ব্যবহার করে না , যা অবজেক্টআউটপুট স্ট্রিম ব্যবহার করে বোঝায়। কোডটির একটি লিঙ্কের জন্য github.com/eishay/jvm-serialization/wiki/ToolBehavior দেখুন । পরিবর্তে, এটি হস্ত-লিখিত কোড যা ডেটাআউটপুট স্ট্রিম ব্যবহার করে, সুতরাং এটি ऑজেক্টআউটপুটস্ট্রিমকে ধীর করে তোলে এমন জিনিসগুলির দ্বারা ক্ষতিগ্রস্থ হয় না (যেমন বস্তুর নজরে নজর রাখা এবং অবজেক্ট চক্র সমর্থন করা)।
এস্কো লুনটলা

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

2
আমাকে কেবল একটি কাস্টম সংগ্রহ লিখতে হয়েছিল এবং আমার বলতে হবে যে এটি Externalizableআমার চেয়ে আরও ভাল its -ক্লাস সহজেই কলটিতে কল করে লকিং যুক্ত করতে পারে writeExternal()। হ্যাঁ, বহিরাগত এখনও খুব প্রাসঙ্গিক, অবশ্যই বড় বা জটিল বস্তুর জন্য।
হারাভিক

37

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

  ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("/Users/Desktop/files/temp.txt"));
        oos.writeObject(linkedListHead); //writing head of linked list
        oos.close();

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

public class MyExternalizable implements Externalizable
{

private String userName;
private String passWord;
private Integer roll;

public MyExternalizable()
{

}

public MyExternalizable(String userName, String passWord, Integer roll)
{
    this.userName = userName;
    this.passWord = passWord;
    this.roll = roll;
}

@Override
public void writeExternal(ObjectOutput oo) throws IOException 
{
    oo.writeObject(userName);
    oo.writeObject(roll);
}

@Override
public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException 
{
    userName = (String)oi.readObject();
    roll = (Integer)oi.readObject();
}

public String toString()
{
    StringBuilder b = new StringBuilder();
    b.append("userName: ");
    b.append(userName);
    b.append("  passWord: ");
    b.append(passWord);
    b.append("  roll: ");
    b.append(roll);

    return b.toString();
}
public static void main(String[] args)
{
    try
    {
        MyExternalizable m  = new MyExternalizable("nikki", "student001", 20);
        System.out.println(m.toString());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/Desktop/files/temp1.txt"));
        oos.writeObject(m);
        oos.close();

        System.out.println("***********************************************************************");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/Users/Desktop/files/temp1.txt"));
        MyExternalizable mm = (MyExternalizable)ois.readObject();
        mm.toString();
        System.out.println(mm.toString());
    } 
    catch (ClassNotFoundException ex) 
    {
        Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch(IOException ex)
    {
        Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}

এখানে আপনি যদি ডিফল্ট নির্মাতাকে মন্তব্য করেন তবে কোডটি ব্যতিক্রমের নীচে ফেলে দেবে:

 java.io.InvalidClassException: javaserialization.MyExternalizable;     
 javaserialization.MyExternalizable; no valid constructor.

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

উপরের কোডটির আউটপুট নীচে অনুযায়ী:

userName: nikki  passWord: student001  roll: 20
***********************************************************************
userName: nikki  passWord: null  roll: 20

আমরা পর্যবেক্ষণ করতে পারি যেহেতু আমরা পাসওয়ার্ডের মান নির্ধারণ করছি না তাই এটি বাতিল।

পাসওয়ার্ড ক্ষেত্রকে ক্ষণস্থায়ী হিসাবে ঘোষণা করেও এটি অর্জন করা যায়।

private transient String passWord;

আশা করি এটা সাহায্য করবে. আমি কোন ভুল হলে আমি ক্ষমা চাই। ধন্যবাদ।


22

Serializableএবং মধ্যে মূল পার্থক্যExternalizable

  1. চিহ্নিতকারী ইন্টারফেস : Serializableকোনও পদ্ধতি ছাড়াই চিহ্নিত ইন্টারফেস। Externalizableইন্টারফেস দুটি পদ্ধতি রয়েছে: writeExternal()এবং readExternal()
  2. সিরিয়ালাইজেশন প্রক্রিয়া : ডিফল্ট ক্রমিকায়ন প্রক্রিয়াটি Serializableইন্টারফেস প্রয়োগকারী ক্লাসগুলির জন্য শুরু করা হবে । প্রোগ্রামার সংজ্ঞায়িত সিরিয়ালাইজেশন প্রক্রিয়াটি Externalizableইন্টারফেস প্রয়োগকারী ক্লাসগুলির জন্য লাথি-ইন করা হবে ।
  3. রক্ষণাবেক্ষণ : বেমানান পরিবর্তনগুলি সিরিয়ালিকেশনটি ভেঙে দিতে পারে।
  4. পশ্চাদগম্য সামঞ্জস্যতা এবং নিয়ন্ত্রণ : আপনার যদি একাধিক সংস্করণ সমর্থন করতে হয় তবে আপনার Externalizableইন্টারফেসের সাথে পুরো নিয়ন্ত্রণ থাকতে পারে । আপনি আপনার বস্তুর বিভিন্ন সংস্করণ সমর্থন করতে পারেন। আপনি যদি প্রয়োগ করেন Externalizableতবে superক্লাসটি সিরিয়াল করা আপনার দায়িত্ব
  5. পাবলিক নো-আরগ কনস্ট্রাক্টর : Serializableঅবজেক্ট তৈরিতে প্রতিবিম্ব ব্যবহার করে এবং কোনও আরগ কনস্ট্রাক্টরের প্রয়োজন হয় না। তবে Externalizableপাবলিক নো-আরগ কনস্ট্রাক্টর দাবি করে।

পড়ুন ব্লগ দ্বারা Hitesh Gargআরো বিস্তারিত জানার জন্য।


1
(3) ভুল। বিদ্যমান অবজেক্টের ডি-সিরিয়ালাইজেশন না ভেঙে আপনি ক্লাসে যে পরিবর্তনগুলি করতে পারেন তার একটি বৃহত প্রতিলিপি রয়েছে এবং সিরিয়ালাইজযোগ্য সদস্য যুক্ত করা অবশ্যই তাদের মধ্যে একটি। সেগুলি মুছে ফেলা অন্য একটি। দেখুন অবজেক্ট ভারশনিং অধ্যায় জাভা অবজেক্ট ধারাবাহিকতাতে স্পেসিফিকেশন।
লার্নের মারকুইস

1
পুনরায় বাক্য বাক্য।
রবীন্দ্র বাবু

সিরিয়ালাইজেশন অনুচ্ছেদে লিঙ্কটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ।
JL_SO

21

সিরিয়ালাইজেশন অবজেক্টটি সংরক্ষণ এবং পুনরায় তৈরি করতে নির্দিষ্ট ডিফল্ট আচরণ ব্যবহার করে। রেফারেন্স এবং জটিল ডেটা স্ট্রাকচার কী অর্ডারে বা পরিচালনা করতে হয় তা আপনি নির্দিষ্ট করতে পারেন তবে শেষ পর্যন্ত এটি প্রতিটি আদিম ডেটা ক্ষেত্রের জন্য ডিফল্ট আচরণ ব্যবহার করে নেমে আসে।

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


5
আমরা "নির্বাচিত আইডি" এর বৃহত সংগ্রহের জন্য বহিরাগতকে ব্যবহার করি - এটি ডিফল্ট সিরিয়ালাইজেশনের চেয়ে কম-বেশি-কম গণনা এবং আদিম ints এর অ্যারে হিসাবে বহিরাগত ছিল external এটি খুব সাধারণ ইউজকেস, "বিশেষ" বা "অনন্য" কিছুই নয়।
থমাস ডাব্লু

9

অবজেক্ট সিরিয়ালাইজেশন সিরিয়ালাইজেবল এবং এক্সটার্নালাইজেবল ইন্টারফেস ব্যবহার করে। একটি জাভা অবজেক্ট কেবল সিরিয়ালাইজযোগ্য। যদি কোনও শ্রেণি বা এর সুপারক্লাসগুলির কোনওটি জাভা.আইও.সিরাইজযোগ্য ইন্টারফেস বা এর সাব-ইন্টারফেস, জাভা.আই.ও এক্সটার্নালাইজেবল কার্যকর করে। জাভা ক্লাসের বেশিরভাগই সিরিয়ালযোগ্য

  • NotSerializableException: packageName.ClassNameSerial সিরিয়ালাইজেশন প্রক্রিয়াতে কোনও ক্লাস অবজেক্টে অংশ নিতে, শ্রেণিকে অবশ্যই সিরিয়ালাইজেবল বা বহিরাগতযোগ্য ইন্টারফেস প্রয়োগ করতে হবে।

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


সিরিয়ালাইজযোগ্য ইন্টারফেস

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

package java.io;

public interface Serializable {};
  • সিরিয়ালাইজেশন ইন্টারফেসের কোনও পদ্ধতি বা ক্ষেত্র নেই এবং কেবল সিরিয়ালাইজযোগ্য হওয়ার শব্দার্থকগুলি সনাক্ত করতে পরিবেশন করে। শ্রেণি সিরিয়ালাইজ / ডিসায়রিয়ালের জন্য হয় হয় আমরা ডিফল্ট রাইটওবজেক্ট এবং রিডঅবজেক্ট পদ্ধতি ব্যবহার করতে পারি (বা) আমরা ক্লাস থেকে রাইটওজেক্ট এবং রিডঅবজেক্ট পদ্ধতিগুলিকে ওভাররাইড করতে পারি।
  • জেভিএমের অবজেক্টটিকে সিরিয়ালাইজ করার ক্ষেত্রে সম্পূর্ণ নিয়ন্ত্রণ থাকবে। ডেটা সদস্যকে ক্রমিকায়িত হতে বাধা দিতে ক্ষণস্থায়ী কীওয়ার্ড ব্যবহার করুন ।
  • এখানে সিরিয়ালাইজযোগ্য অবজেক্টগুলি কার্যকর না করেই সরাসরি স্ট্রিম থেকে পুনর্গঠন করা হয়
  • InvalidClassExceptionSe deserialization প্রক্রিয়ায়, যদি স্থানীয় শ্রেণীর ক্রমিক সংস্করণ মান সংশ্লিষ্ট প্রেরকের শ্রেণীর চেয়ে আলাদা হয়। তারপরে ফলাফল হিসাবে বিরোধ হিসাবে java.io.InvalidClassException: com.github.objects.User; local class incompatible: stream classdesc serialVersionUID = 5081877, local class serialVersionUID = 50818771
  • শ্রেণীর অস্থায়ী এবং অ স্থিতিশীল ক্ষেত্রগুলির মান ক্রমিকায়িত হয়।

বাহ্যিক ইন্টারফেস

বহির্মুখী বস্তুর জন্য, কেবলমাত্র বস্তুর শ্রেণীর পরিচয় ধারক দ্বারা সংরক্ষণ করা হয়; শ্রেণিকে অবশ্যই সামগ্রীগুলি সংরক্ষণ এবং পুনরুদ্ধার করতে হবে। বহির্মুখী ইন্টারফেসটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

package java.io;

public interface Externalizable extends Serializable
{
    public void writeExternal(ObjectOutput out)
        throws IOException;

    public void readExternal(ObjectInput in)
        throws IOException, java.lang.ClassNotFoundException;
}
  • এক্সটারনালাইজেবল ইন্টারফেসের দুটি পদ্ধতি রয়েছে, একটি বহিরাগতের অবজেক্টের অবশ্যই কোনও অবজেক্টের অবস্থা বাঁচাতে / পুনরুদ্ধার করতে একটি WritExternally এবং ReadExternental পদ্ধতি প্রয়োগ করতে হবে।
  • প্রোগ্রামারকে কোন বিষয়গুলি সিরিয়ালিয়াল করতে হবে সেদিকে খেয়াল রাখতে হবে। প্রোগ্রামার হিসাবে সিরিয়ালাইজেশনের যত্ন নেয় তাই এখানে ক্ষণস্থায়ী কীওয়ার্ড সিরিয়ালাইজেশন প্রক্রিয়াতে কোনও বস্তুকে সীমাবদ্ধ করে না।
  • যখন একটি বহিরাগত অবজেক্টটি পুনর্গঠন করা হয়, সর্বজনীন নো-আরগ নির্মাণকারী ব্যবহার করে একটি উদাহরণ তৈরি করা হয়, তারপরে পঠন-বহিরাগত পদ্ধতিটি ডাকা হয়। সিরিজযুক্তযোগ্য বস্তুগুলিকে একটি অবজেক্ট ইনপুট স্ট্রিম থেকে পড়ে পুনরুদ্ধার করা হয়।
  • OptionalDataExceptionWe ক্ষেত্রগুলি একই অর্ডার এবং প্রকারের মধ্যে থাকা উচিত যেমন আমরা তাদের লিখেছি। স্ট্রিম থেকে যদি কোনও অমিলের ধরণ থাকে তবে এটি ptionচ্ছিক ডেটাএক্সসেপশনকে ছুড়ে ফেলে।

    @Override public void writeExternal(ObjectOutput out) throws IOException {
        out.writeInt( id );
        out.writeUTF( role );
        out.writeObject(address);
    }
    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.id = in.readInt();
        this.address = (Address) in.readObject();
        this.role = in.readUTF();
    }
  • শ্রেণীর উদাহরণ ক্ষেত্র যা সিরিয়ালযুক্ত হওয়ার জন্য লিখিত (উন্মুক্ত)ObjectOutput


উদাহরণ « কার্যকরী Serializable

class Role {
    String role;
}
class User extends Role implements Serializable {

    private static final long serialVersionUID = 5081877L;
    Integer id;
    Address address;

    public User() {
        System.out.println("Default Constructor get executed.");
    }
    public User( String role ) {
        this.role = role;
        System.out.println("Parametarised Constructor.");
    }
}

class Address implements Serializable {

    private static final long serialVersionUID = 5081877L;
    String country;
}

উদাহরণ « বহির্মুখী প্রয়োগ করে

class User extends Role implements Externalizable {

    Integer id;
    Address address;
    // mandatory public no-arg constructor
    public User() {
        System.out.println("Default Constructor get executed.");
    }
    public User( String role ) {
        this.role = role;
        System.out.println("Parametarised Constructor.");
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeInt( id );
        out.writeUTF( role );
        out.writeObject(address);
    }
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.id = in.readInt();
        this.address = (Address) in.readObject();
        this.role = in.readUTF();
    }
}

উদাহরণ

public class CustomClass_Serialization {
    static String serFilename = "D:/serializable_CustomClass.ser";

    public static void main(String[] args) throws IOException {
        Address add = new Address();
        add.country = "IND";

        User obj = new User("SE");
        obj.id = 7;
        obj.address = add;

        // Serialization
        objects_serialize(obj, serFilename);
        objects_deserialize(obj, serFilename);

        // Externalization
        objects_WriteRead_External(obj, serFilename);
    }

    public static void objects_serialize( User obj, String serFilename ) throws IOException{
        FileOutputStream fos = new FileOutputStream( new File( serFilename ) );
        ObjectOutputStream objectOut = new ObjectOutputStream( fos );

        // java.io.NotSerializableException: com.github.objects.Address
        objectOut.writeObject( obj );
        objectOut.flush();
        objectOut.close();
        fos.close();

        System.out.println("Data Stored in to a file");
    }
    public static void objects_deserialize( User obj, String serFilename ) throws IOException{
        try {
            FileInputStream fis = new FileInputStream( new File( serFilename ) );
            ObjectInputStream ois = new ObjectInputStream( fis );
            Object readObject;
            readObject = ois.readObject();
            String calssName = readObject.getClass().getName();
            System.out.println("Restoring Class Name : "+ calssName); // InvalidClassException

            User user = (User) readObject;
            System.out.format("Obj[Id:%d, Role:%s] \n", user.id, user.role);

            Address add = (Address) user.address;
            System.out.println("Inner Obj : "+ add.country );
            ois.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void objects_WriteRead_External( User obj, String serFilename ) throws IOException {
        FileOutputStream fos = new FileOutputStream(new File( serFilename ));
        ObjectOutputStream objectOut = new ObjectOutputStream( fos );

        obj.writeExternal( objectOut );
        objectOut.flush();

        fos.close();

        System.out.println("Data Stored in to a file");

        try {
            // create a new instance and read the assign the contents from stream.
            User user = new User();

            FileInputStream fis = new FileInputStream(new File( serFilename ));
            ObjectInputStream ois = new ObjectInputStream( fis );

            user.readExternal(ois);

            System.out.format("Obj[Id:%d, Role:%s] \n", user.id, user.role);

            Address add = (Address) user.address;
            System.out.println("Inner Obj : "+ add.country );
            ois.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

@দেখা


7

বহির্মুখী ইন্টারফেসটি সিরিয়ালাইজেশন প্রক্রিয়াটির পারফরম্যান্সটিকে অনুকূল করার জন্য আসলে সরবরাহ করা হয়নি! তবে আপনার নিজস্ব কাস্টম প্রসেসিং বাস্তবায়নের মাধ্যম সরবরাহ করার জন্য এবং কোনও অবজেক্ট এবং এর সুপার টাইপের স্ট্রিমের ফর্ম্যাট এবং সামগ্রীর উপর সম্পূর্ণ নিয়ন্ত্রণ অফার করুন!

নেটওয়ার্কের মাধ্যমে নেটিভ অ্যাকশন স্ক্রিপ্ট অবজেক্টগুলি স্থানান্তর করতে এএমএফ (অ্যাকশনস্ক্রিপ্ট মেসেজ ফর্ম্যাট) রিমোটিং এর উদাহরণগুলি।


7

https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html

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

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

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


2

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


2

সিরিয়ালাইজেবল এবং এক্সটারনালাইজেবলের মধ্যে অনেক পার্থক্য রয়েছে তবে আমরা যখন কাস্টম সিরিয়ালাইজেবল (ওভাররাইডেড রাইটওজেক্ট () এবং রিডঅবজেক্ট ()) এবং এক্সটারনালাইজেবলের মধ্যে পার্থক্যটি তুলনা করি তখন আমরা দেখতে পাই কাস্টম প্রয়োগটি দৃ Ob়ভাবে অবজেক্ট আউটপুটস্ট্রিম শ্রেণীর সাথে আবদ্ধ যেখানে বহিরাগত ক্ষেত্রে আমরা নিজেরাই অবজেক্টআউটপুট একটি বাস্তবায়ন সরবরাহ করুন যা অবজেক্টআউটপুট স্ট্রিম শ্রেণি হতে পারে বা এটি org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream এর মতো অন্য কিছু হতে পারে provide

বাহ্যিক ইন্টারফেসের ক্ষেত্রে

@Override
public void writeExternal(ObjectOutput out) throws IOException {
    out.writeUTF(key);
    out.writeUTF(value);
    out.writeObject(emp);
}

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    this.key = in.readUTF();
    this.value = in.readUTF();
    this.emp = (Employee) in.readObject();
}





**In case of Serializable interface**


        /* 
             We can comment below two method and use default serialization process as well
             Sequence of class attributes in read and write methods MUST BE same.
        // below will not work it will not work . 
        // Exception = java.io.StreamCorruptedException: invalid type code: 00\
              private void writeObject(java.io.ObjectOutput stream) 
              */
            private void writeObject(java.io.ObjectOutputStream Outstream)
                    throws IOException {

                System.out.println("from writeObject()");
                /*     We can define custom validation or business rules inside read/write methods.
 This way our validation methods will be automatically 
    called by JVM, immediately after default serialization 
    and deserialization process 
    happens.
                 checkTestInfo();
                */

                stream.writeUTF(name);
                stream.writeInt(age);
                stream.writeObject(salary);
                stream.writeObject(address);
            }

            private void readObject(java.io.ObjectInputStream Instream)
                    throws IOException, ClassNotFoundException {
                System.out.println("from readObject()");
                name = (String) stream.readUTF();
                age = stream.readInt();
                salary = (BigDecimal) stream.readObject();
                address = (Address) stream.readObject();
                // validateTestInfo();
            }

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


1
আপনি আরও বিস্তারিত বলতে পারেন? এটি পড়ার সাথে সাথে আপনি কী বলার চেষ্টা করছেন তা আমি বুঝতে পারি না। এছাড়াও, যদি আপনি কিছু অনুচ্ছেদ এবং উদাহরণ সহ পাঠ্যটি ফর্ম্যাট করতে পারেন তবে এটি দুর্দান্ত উত্তর হতে পারে।
শিরকম

0

মূলত, Serializableএটি একটি মার্কার ইন্টারফেস যা বোঝায় যে কোনও শ্রেণি সিরিয়ালাইজেশনের জন্য নিরাপদ এবং জেভিএম নির্ধারণ করে যে এটি কীভাবে সিরিয়ালায়িত হয়। Externalizable2 পদ্ধতি রয়েছে, readExternalএবং writeExternalExternalizableপ্রবর্তককে কোনও বস্তু কীভাবে সিরিয়ালাইজ করা হয় তা নির্ধারণের অনুমতি দেয়, যেখানে Serializableসিরিয়াল হিসাবে বস্তুগুলি ডিফল্ট উপায়ে হয়।


0

কিছু পার্থক্য:

  1. সিরিয়ালাইজেশনের জন্য class শ্রেণীর ডিফল্ট নির্মাণকারীর প্রয়োজন নেই কারণ অবজেক্ট কারণ জেভিএম রিফ্লেকশন এপিআইয়ের সাহায্যে একইটি নির্মাণ করে। কোনও আরগের সাথে বহিরাগতকরণের কনট্রাক্টরের ক্ষেত্রে প্রয়োজনীয়তা নেই, কারণ নিয়ন্ত্রণটি প্রোগ্রামারের হাতে থাকে এবং পরে সেটটারগুলির মাধ্যমে আপত্তি জানাতে ডিসরিওলাইজড ডেটা নির্ধারণ করে।

  2. সিরিয়ালাইজেশনে ব্যবহারকারী যদি নির্দিষ্ট বৈশিষ্ট্যগুলি সিরিয়ালায়িত করার জন্য ছেড়ে যেতে চান তবে সেই বৈশিষ্ট্যটিকে ক্ষণস্থায়ী হিসাবে চিহ্নিত করতে হবে, বিপরীতে বহিরাগতকরণের জন্য প্রয়োজনীয় নয়।

  3. যখন কোনও শ্রেণীর জন্য পশ্চাদপটে সামঞ্জস্য সমর্থন সমর্থন করা হয় তখন বহিরাগতের সাথে যাওয়ার পরামর্শ দেওয়া হয়। সিরিয়ালাইজেশন ডিফল্ট অবজেক্ট অব্যাহত রাখার সমর্থন করে এবং যদি অবজেক্টের কাঠামোটি ভেঙে যায় তবে এটি ডিসস্রায়ালাইজ করার সময় সমস্যা তৈরি করবে।

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