সিরিয়ালাইজ করা অবজেক্টের পরিবর্তে পার্সেবল ব্যবহারের সুবিধা


97

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

উত্তর:


99

"প্রো অ্যান্ড্রয়েড 2" থেকে

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

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


9
"প্রো অ্যান্ড্রয়েড 2" কী?
অ্যালিকেলিন-কিলাকা

79
দ্বিতীয় অনুচ্ছেদটি সত্য নয়, আপনি বান্ডিলটি ব্যবহার করে কোনও ক্রিয়াকলাপ হিসাবে পার্সেবলকে পাস করতে পারেন ...
আইএক্সএক্স

4
যখন আমি আমার অবজেক্টগুলিকে সিরিয়াল করি আমি একটি getBundleপদ্ধতি তৈরি করি , তারপরে writeToParcelএটিকে কল করুন dest.writeBundle(getBundle());এবং আমার কাছে উভয় বিকল্প স্বয়ংক্রিয়ভাবে উপলব্ধ। এখানে লাইভ অবজেক্টগুলির জন্য আকর্ষণীয় পার্সেল বৈশিষ্ট্য রয়েছে: ডেভেলপার.অ্যান্ড্রয়েড
রেফারেন্স

4
@ এলএক্সএক্স: আমি ভাবছিলাম যে কেন একজনকে ক্রিয়াকলাপের জন্য বান্ডিলের মাধ্যমে পার্সেবল বস্তুটি পাস করতে হবে। আইএমও আপনি যদি এটি করেন তবে আপনি অযৌক্তিকভাবে সিরিয়ালকরণের আরও একটি স্তর যুক্ত করছেন এবং অন্য কিছু নয়।
উঠুন

4
ফিলিপ ব্রেকল্ট এ সম্পর্কে একটি দুর্দান্ত নিবন্ধ তৈরি করেছিলেন এবং একটি পারফরম্যান্স টেস্টও যুক্ত করেছিলেন। বিকাশকারী
পার্সেবল-vs

23

Serializableঅ্যান্ড্রয়েডে হাস্যকরভাবে ধীর। বর্ডারলাইন বাস্তবে অনেক ক্ষেত্রে অকেজো।

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

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

public interface Packageable {
    public void readFromPackage(PackageInputStream in)  throws IOException ;
    public void writeToPackage(PackageOutputStream out)  throws IOException ; 
}


public final class PackageInputStream {

    private DataInputStream input;

    public PackageInputStream(InputStream in) {
        input = new DataInputStream(new BufferedInputStream(in));
    }

    public void close() throws IOException {
        if (input != null) {
            input.close();
            input = null;
        }       
    }

    // Primitives
    public final int readInt() throws IOException {
        return input.readInt();
    }
    public final long readLong() throws IOException {
        return input.readLong();
    }
    public final long[] readLongArray() throws IOException {
        int c = input.readInt();
        if (c == -1) {
            return null;
        }
        long[] a = new long[c];
        for (int i=0 ; i<c ; i++) {
            a[i] = input.readLong();
        }
        return a;
    }

...

    public final String readString()  throws IOException {
        return input.readUTF();
    }
    public final <T extends Packageable> ArrayList<T> readPackageableList(Class<T> clazz) throws IOException {
        int N = readInt();
        if (N == -1) {
            return null;
        }
        ArrayList<T> list = new ArrayList<T>();
        while (N>0) {
            try {
                T item = (T) clazz.newInstance();
                item.readFromPackage(this);
                list.add(item);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            N--;
        }
        return list;
    }

}



public final class PackageOutputStream {

    private DataOutputStream output;

    public PackageOutputStream(OutputStream out) {
        output = new DataOutputStream(new BufferedOutputStream(out));
    }

    public void close() throws IOException {
        if (output != null) {
            output.close();
            output = null;
        }
    }

    // Primitives
    public final void writeInt(int val) throws IOException {
        output.writeInt(val);
    }
    public final void writeLong(long val) throws IOException {
        output.writeLong(val);
    }
    public final void writeLongArray(long[] val) throws IOException {
        if (val == null) {
            writeInt(-1);
            return;
        }
        writeInt(val.length);
        for (int i=0 ; i<val.length ; i++) {
            output.writeLong(val[i]);
        }
    }

    public final void writeFloat(float val) throws IOException {
        output.writeFloat(val);
    }
    public final void writeDouble(double val) throws IOException {
        output.writeDouble(val);
    }
    public final void writeString(String val) throws IOException {
        if (val == null) {
            output.writeUTF("");
            return;
        }
        output.writeUTF(val);
    }

    public final <T extends Packageable> void writePackageableList(ArrayList<T> val) throws IOException {
        if (val == null) {
            writeInt(-1);
            return;
        }
        int N = val.size();
        int i=0;
        writeInt(N);
        while (i < N) {
            Packageable item = val.get(i);
            item.writeToPackage(this);
            i++;
        }
    }

}

4
আপনার এই কাস্টম শ্রেণীর ব্যবহার এবং কেবল বহিরাগত ইন্টারফেস বাস্তবায়ন এবং একই জিনিসটি করার মধ্যে পার্থক্য কী?
ক্যারোটম্যান 42

4
বান্ডেল ক্ষেত্রের নামগুলিও সিরিয়ালাইজ করে ... এটি হাজার হাজার বস্তুর জন্য উপযুক্ত নয়।
রূবেন স্ক্র্যাটন

4
দুঃখিত, এখনও অন্য serializer উদ্ভাবন sucks - এখন শুধু আরেকটি "Parcelable" সঙ্গে মোকাবেলা করতে হয়। লাইব্রেরি সহ অনেকগুলি বাছাই করতে পারে (পার্থক্যটি হ'ল গ্রন্থাগারটি অন্যান্য লোকেরা ব্যবহার করে এমন ফর্ম্যাটটি পরীক্ষা করা, পরীক্ষা করা এবং ব্যবহার করা হয়): প্রোটোকলবাফারস, জেএসএন, এক্সএমএল, ইত্যাদি, এন্ড্রয়েড লাইব্রেরি সত্যিই এই ক্ষেত্রে ব্যর্থ হয় এটি লজ্জার বিষয় ।

4
আমি মনে করি না খোলার বাক্যটি আর সত্য (এটি তৈরির 5 বছর পরে)। আমি দীর্ঘদিন ধরে কোনও সমস্যা ছাড়াই জাভা সিরিয়ালাইজেশন ব্যবহার করছি। আমি সবেমাত্র লিখেছি এমন একটি ব্লগ পোস্টে আপনি এই বিষয়টিতে কিছু সম্ভাব্য আকর্ষণীয় জিনিস পেতে পারেন। nemanjakovacevic.net/blog/english/2015/03/24/…
নেমানজা কোভাসেভিক

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


11

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

এটি যথাযথভাবে প্রয়োগ করা হলে পার্সেবলের গতির সাথে মেলে এবং অ্যান্ড্রয়েড এবং / অথবা জাভা প্ল্যাটফর্মের বিভিন্ন সংস্করণের মধ্যে সামঞ্জস্যতার জন্য অ্যাকাউন্ট করে।

এই নিবন্ধটি জিনিসগুলিও পরিষ্কার করতে পারে:

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

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

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking


7

মনে হয় আজকাল পার্থক্যটি এতটা লক্ষণীয় নয়, আপনি নিজের কার্যকলাপের মধ্যে চালানোর সময় অন্তত নয়।

এই ওয়েবসাইটে প্রদর্শিত পরীক্ষাগুলি অনুসারে , পার্সেলেবল নতুন ডিভাইসগুলিতে (নেক্সাস 10 এর মতো) প্রায় 10 গুণ দ্রুত এবং পুরানোগুলিতে প্রায় 17 গতিবেগ (যেমন ইচ্ছা জেড)

সুতরাং এটির মূল্য আছে কিনা তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে।

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


আমি মনে করি আপনি এই অর্থটি ঠিক বলেছেন যে পার্থক্যটি সঙ্কুচিত হচ্ছে। তবে আমি জানতে পেরেছি যে সিরিয়ালাইজেবল ব্যবহার মার্শাল বাইট অ্যারের আকারের ক্ষেত্রে আরও বেশি দক্ষ হতে পারে এবং এটি ট্রানজেকশনটুলারজিপশন এড়াতে সহায়তা করতে পারে। আমি এই (আমার) ব্লগ পোস্ট নেমানজাকোভেসেভিট.net
নেমানজা কোভাসেভিচ

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

4

পার্সেলেবল মূলত বাইন্ডার অবকাঠামো ব্যবহার করে আইপিসির সাথে সম্পর্কিত , যেখানে পার্সেল হিসাবে ডেটা পাস করা হয় ।

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

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


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

1

এই নিবন্ধের উপর ভিত্তি করে http://www.mooproductions.org/node/6?page=5 পার্সেবল দ্রুত হওয়া উচিত।

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


1

আমি কেবল জেএসএন স্ট্রিংয়ের জন্য জিএসএন -> সিরিয়ালাইজ -> জেএসএন স্ট্রিং থেকে অবজেক্ট পুনরুদ্ধার করব।


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

0

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

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